Значение ключа, кодирующее методы доступа
Для кодирования значения ключа для определения местоположения методов доступа использовать для вызовов valueForKey:
, setValue:forKey:
, mutableArrayValueForKey:
, и mutableSetValueForKey:
, необходимо реализовать значение ключа, кодирующее методы доступа.
Обычно используемые образцы средства доступа
Формат для метода доступа, возвращающего свойство, -<key>
. -<key>
метод возвращает объект, скаляр или структуру данных. Альтернативная форма именования -is<Key>
поддерживается для булево свойств.
Пример в Перечислении 1 показывает объявление метода для hidden
свойство с помощью типичного соглашения и Распечатки 2 показывает альтернативный формат.
Изменения именования Средства доступа перечисления 1 для скрытого ключа свойства
- (BOOL)hidden { |
// Implementation specific code. |
return ...; |
} |
Альтернатива перечисления 2 формирует средство доступа для скрытого ключа свойства
- (BOOL)isHidden { |
// Implementation specific code. |
return ...; |
} |
Для атрибута или к - одно свойство отношения для поддержки setValue:forKey:
, средство доступа в форме set<Key>:
должен быть реализован. Перечисление 3 показывает метод доступа в качестве примера для hidden
ключ свойства.
Соглашение о присвоении имен Средства доступа перечисления 3 поддерживать скрытый ключ свойства
- (void)setHidden:(BOOL)flag { |
// Implementation specific code. |
return; |
} |
Если атрибут является нетипом объекта, необходимо также реализовать подходящие средние значения представления a nil
значение. Метод кодирования значения ключа setNilValueForKey:
когда Вы пытаетесь установить атрибут в, метод вызывают nil
. Это предоставляет возможность для обеспечения надлежащих значений по умолчанию для приложения или ключей дескриптора, не имеющих соответствующих средств доступа в классе.
Следующий пример устанавливает hidden
атрибут к YES
когда попытка предпринята для установки его в nil
. Это создает NSNumber
экземпляр, содержащий булево значение и затем, использует setValue:forKey:
установить новое значение. Это поддерживает инкапсуляцию модели и гарантирует, что фактически произойдут любые дополнительные действия, которые должны произойти в результате установки значения. Это считают лучшей практикой, чем вызов метода доступа или установка переменной экземпляра непосредственно.
- (void)setNilValueForKey:(NSString *)theKey { |
if ([theKey isEqualToString:@"hidden"]) { |
[self setValue:@YES forKey:@"hidden"]; |
} |
else { |
[super setNilValueForKey:theKey]; |
} |
} |
Образцы средства доступа набора для к - много свойств
Несмотря на то, что Ваше приложение может реализовать методы доступа для к - много свойств отношения с помощью -<key>
и -set<Key>:
формы средства доступа, необходимо обычно только использовать тех для создания объекта коллекции. Для управления содержанием набора это - наиболее успешная практика для реализации дополнительных методов доступа, называемых методами доступа набора. Вы тогда используете методы доступа набора или непостоянный прокси набора, возвращенный mutableArrayValueForKey:
или mutableSetValueForKey:
.
Реализование методов доступа набора, вместо, или в дополнение к, основной метод get для отношения, может иметь много преимуществ:
Производительность может быть увеличена в случае непостоянного до - много отношений, часто значительно.
К - много отношений могут быть смоделированы с классами кроме
NSArray
илиNSSet
путем реализации надлежащих средств доступа набора. Реализация методов доступа набора для свойства делает то свойство неотличимым от массива или набора при использовании методов кодирования значения ключа.Можно использовать методы доступа набора непосредственно для создания модификаций к набору в значении ключа, наблюдая совместимый путь. Посмотрите, что Значение ключа Наблюдает Руководство по программированию для получения дополнительной информации о наблюдении значения ключа.
Существует два изменения средств доступа набора: индексируемые средства доступа для упорядоченного - много отношений (обычно представленный NSArray
) и неупорядоченные средства доступа для отношений, не требующих порядка элементам (представленный NSSet
).
Индексируемый образец средства доступа
Индексируемые методы доступа определяют механизм для подсчета, получения, добавления и замены объектов в упорядоченном отношении. Обычно это отношение является экземпляром NSArray
или NSMutableArray
; однако, любой объект может реализовать эти методы и управляться так же, как если бы это был массив. Вы не ограничиваетесь простой реализацией этих методов, можно также вызвать их также для взаимодействия непосредственно с объектами в отношении.
Существуют индексированные средства доступа, возвращающие данные из набора (изменение метода get) и непостоянные средства доступа, обеспечивающие интерфейс для mutableArrayValueForKey:
изменить набор.
Метод get индексируемые средства доступа
Для поддержки доступа только для чтения к упорядоченному - многие отношение, реализуйте следующие методы:
-countOf<Key>
. Требуемый. Это - аналогичноеNSArray
примитивный методcount
.-objectIn<Key>AtIndex:
или-<key>AtIndexes:
. Один из этих методов должен быть реализован. Они соответствуютNSArray
методыobjectAtIndex:
иobjectsAtIndexes:
.-get<Key>:range:
. Реализация этого метода является дополнительной, но предлагает дополнительное увеличение производительности. Этот метод соответствуетNSArray
методgetObjects:range:
.
Реализация -countOf<Key>
метод просто возвращает число объектов в к - многие отношение как NSUInteger
. Фрагмент кода в Перечислении 4 иллюстрирует -countOf<Key>
реализация для к - многие свойство отношения employees
.
Пример перечисления 4 -count<Key>
реализация
- (NSUInteger)countOfEmployees { |
return [self.employees count]; |
} |
-objectIn<Key>AtIndex:
метод возвращает объект в указанном индексе в к - многие отношение. -<key>AtIndexes:
форма средства доступа возвращает массив объектов в индексах, указанных NSIndexSet
параметр. Только один из этих двух методов должен быть реализован.
Фрагмент кода в Перечислении 5 показывает -objectIn<Key>AtIndex:
и -<key>AtIndexes:
реализации для к - многие свойство отношения employees
.
Пример перечисления 5 -objectIn<Key>AtIndex:
и -<key>AtIndexes:
реализации
- (id)objectInEmployeesAtIndex:(NSUInteger)index { |
return [employees objectAtIndex:index]; |
} |
- (NSArray *)employeesAtIndexes:(NSIndexSet *)indexes { |
return [self.employees objectsAtIndexes:indexes]; |
} |
Если сравнительное тестирование указывает, что повышения производительности требуются, можно также реализовать -get<Key>:range:
. Ваша реализация этого средства доступа должна возвратить в буфере, данном как первый параметр объекты, находящиеся в пределах диапазона, указанного вторым параметром.
Перечисление 6 показывает реализацию в качестве примера -get<Key>:range:
образец средства доступа для к - многие employees
свойство.
Пример перечисления 6 -get<Key>:range:
реализация
- (void)getEmployees:(Employee * __unsafe_unretained *)buffer range:(NSRange)inRange { |
// Return the objects in the specified range in the provided buffer. |
// For example, if the employees were stored in an underlying NSArray |
[self.employees getObjects:buffer range:inRange]; |
} |
Непостоянные индексируемые средства доступа
При поддержке непостоянного к - многие отношение с индексируемыми средствами доступа требует дополнительных методов реализации. Реализация непостоянных индексируемых средств доступа позволяет Вашему приложению взаимодействовать с индексируемым набором простым и эффективным способом при помощи прокси массива, возвращенного mutableArrayValueForKey:
. Кроме того, путем реализации этих методов для к - многие отношение класс будет значением ключа, наблюдающим совместимый для того свойства (см., что Значение ключа Наблюдает Руководство по программированию).
Чтобы быть значением ключа, кодирующим совместимый для непостоянного, упорядоченного - многие отношение, необходимо реализовать следующие методы:
-insertObject:in<Key>AtIndex:
или-insert<Key>:atIndexes:
. По крайней мере один из этих методов должен быть реализован. Они походятNSMutableArray
методыinsertObject:atIndex:
иinsertObjects:atIndexes:
.-removeObjectFrom<Key>AtIndex:
или-remove<Key>AtIndexes:
. По крайней мере один из этих методов должен быть реализован. Эти методы соответствуютNSMutableArray
методыremoveObjectAtIndex:
иremoveObjectsAtIndexes:
соответственно.-replaceObjectIn<Key>AtIndex:withObject:
или-replace<Key>AtIndexes:with<Key>:
. Дополнительный. Реализация, если сравнительное тестирование указывает, что производительность является проблемой.
-insertObject:in<Key>AtIndex:
метод передается объект вставить, и NSUInteger
это указывает индекс, где он должен быть вставлен. -insert<Key>:atIndexes:
метод вставляет массив объектов в набор в индексах, указанных переданным NSIndexSet
. Вы только обязаны реализовывать один из этих двух методов.
Перечисление 7 показывает, что демонстрационные реализации оба вставляют средства доступа для к - многие employee
свойство.
Пример перечисления 7 -insertObject:in<Key>AtIndex:
и -insert<Key>:atIndexes:
средства доступа
- (void)insertObject:(Employee *)employee inEmployeesAtIndex:(NSUInteger)index { |
[self.employees insertObject:employee atIndex:index]; |
return; |
} |
- (void)insertEmployees:(NSArray *)employeeArray atIndexes:(NSIndexSet *)indexes { |
[self.employees insertObjects:employeeArray atIndexes:indexes]; |
return; |
} |
-removeObjectFrom<Key>AtIndex:
метод передается NSUInteger
значение, указывающее индекс объекта, который будет удален из отношения. -remove<Key>AtIndexes:
передается NSIndexSet
указание индексов объектов, которые будут удалены из отношения. Снова, Вы только обязаны реализовывать один из этих методов.
Перечисление 8 показывает демонстрационные реализации -removeObjectFrom<Key>AtIndex:
и -remove<Key>AtIndexes:
реализации для к - многие employee
свойство.
Пример перечисления 8 -removeObjectFrom<Key>AtIndex:
и -remove<Key>AtIndexes:
средства доступа
- (void)removeObjectFromEmployeesAtIndex:(NSUInteger)index { |
[self.employees removeObjectAtIndex:index]; |
} |
- (void)removeEmployeesAtIndexes:(NSIndexSet *)indexes { |
[self.employees removeObjectsAtIndexes:indexes]; |
} |
Если сравнительное тестирование указывает, что повышения производительности требуются, можно также реализовать один или оба из дополнительных средств доступа замены. Ваша реализация также -replaceObjectIn<Key>AtIndex:withObject:
или -replace<Key>AtIndexes:with<Key>:
вызываются, когда объект заменяется в наборе, вместо того, чтобы делать удалять, и затем вставьте.
Перечисление 9 показывает демонстрационные реализации -replaceObjectIn<Key>AtIndex:withObject:
и -replace<Key>AtIndexes:with<Key>:
реализации для к - многие employee
свойство.
Пример перечисления 9 -replaceObjectIn<Key>AtIndex:withObject:
и -replace<Key>AtIndexes:with<Key>:
средства доступа
- (void)replaceObjectInEmployeesAtIndex:(NSUInteger)index |
withObject:(id)anObject { |
[self.employees replaceObjectAtIndex:index withObject:anObject]; |
} |
- (void)replaceEmployeesAtIndexes:(NSIndexSet *)indexes |
withEmployees:(NSArray *)employeeArray { |
[self.employees replaceObjectsAtIndexes:indexes withObjects:employeeArray]; |
} |
Неупорядоченный образец средства доступа
Неупорядоченные методы доступа обеспечивают механизм для доступа и видоизменения объектов в неупорядоченном отношении. Как правило, это отношение является экземпляром NSSet
или NSMutableSet
. Однако путем реализации этих средств доступа, любой класс может используемым, чтобы смоделировать отношение и управляться с помощью кодирования значения ключа так же, как если бы это был экземпляр NSSet
.
Метод get, неупорядоченный средства доступа
Изменения метода get неупорядоченных методов доступа обеспечивают простой доступ к данным отношения. Методы возвращают число объектов в наборе, перечислитель для итерации по объектам коллекции и методу для сравнения объекта с содержанием набора, чтобы видеть, присутствует ли это уже.
Для поддержки доступа только для чтения к неупорядоченному к - многие отношение, Вы реализовали бы следующие методы:
-countOf<Key>
. Требуемый. Этот метод соответствуетNSSet
методcount
.-enumeratorOf<Key>
. Требуемый. СоответствуетNSSet
методobjectEnumerator
.-memberOf<Key>:
. Требуемый. Этот метод является эквивалентомNSSet
методmember:
Перечисление 10 показывает простые реализации необходимых средств доступа метода get, просто передающих ответственность перед transactions
свойство.
Пример перечисления 10 -countOf<Key>
, -enumeratorOf<Key>
, и -memberOf<Key>:
средства доступа
- (NSUInteger)countOfTransactions { |
return [self.transactions count]; |
} |
- (NSEnumerator *)enumeratorOfTransactions { |
return [self.transactions objectEnumerator]; |
} |
- (Transaction *)memberOfTransactions:(Transaction *)anObject { |
return [self.transactions member:anObject]; |
} |
-countOf<Key>
реализация средства доступа должна просто возвратить число элементов в отношении. -enumeratorOf<Key>
реализация метода должна возвратиться NSEnumerator
экземпляр, использующийся для итерации по элементам в отношении. Посмотрите Перечисление: Пересечение Элементов Набора в Наборах, Программируя Темы для получения дополнительной информации о перечислителях.
-memberOf<Key>:
средство доступа должно выдержать сравнение, объект передал в качестве параметра с содержанием набора и возвращает соответствующий объект в результате или nil
если не найден никакой соответствующий объект. Ваша реализация этого метода может использовать isEqual:
сравнить объекты, или может сравнить объекты другим способом. Объект возвратился, может быть различный объект, чем протестированный на членство, но это должен быть эквивалент, насколько затронуто содержание.
Непостоянные неупорядоченные средства доступа
При поддержке непостоянного к - многие отношение с неупорядоченными средствами доступа требует дополнительных методов реализации. Реализация непостоянных неупорядоченных средств доступа для приложения для взаимодействия с набором простым и эффективным способом с помощью прокси массива, возвращенного mutableSetValueForKey:
. Кроме того, путем реализации этих методов для к - многие отношение класс будет значением ключа, наблюдающим совместимый для того свойства (см., что Значение ключа Наблюдает Руководство по программированию).
Чтобы быть жалобой на кодирование значения ключа для непостоянного, неупорядоченного - многие отношение, необходимо реализовать следующие методы:
-add<Key>Object:
или-add<Key>:
. По крайней мере один из этих методов должен быть реализован. Они походятNSMutableSet
методaddObject:
.-remove<Key>Object:
или-remove<Key>:
. По крайней мере один из этих методов должен быть реализован. Они походятNSMutableSet
методremoveObject:
.-intersect<Key>:
. Дополнительный. Реализация, если сравнительное тестирование указывает, что производительность является проблемой. Это выполняет эквивалентное действие метода NSSetintersectSet:
.
-add<Key>Object:
и -add<Key>:
реализации добавляют единственный элемент или ряд элементов к отношению. Вы только обязаны реализовывать один из методов. При добавлении ряда элементов к отношению необходимо гарантировать, что эквивалентный объект уже не присутствует в отношении. Перечисление 11 показывает реализацию передачи в качестве примера для transactions
свойство.
Пример перечисления 11 -add<Key>Object:
и -add<Key>:
средства доступа
- (void)addTransactionsObject:(Transaction *)anObject { |
[self.transactions addObject:anObject]; |
} |
- (void)addTransactions:(NSSet *)manyObjects { |
[self.transactions unionSet:manyObjects]; |
} |
Точно так же -remove<Key>Object:
и -remove<Key>:
реализации удаляют единственный элемент или ряд элементов от отношения. Снова, реализация только одного из методов требуется. Перечисление 12 показывает реализацию передачи в качестве примера для transactions
свойство.
Пример перечисления 12 -remove<Key>Object:
и -remove<Key>:
средства доступа
- (void)removeTransactionsObject:(Transaction *)anObject { |
[self.transactions removeObject:anObject]; |
} |
- (void)removeTransactions:(NSSet *)manyObjects { |
[self.transactions minusSet:manyObjects]; |
} |
Если сравнительное тестирование указывает, что повышения производительности требуются, можно также реализовать -intersect<Key>:
или -set<Key>:
методы (см. Перечисление 13).
Реализация -intersect<Key>:
должен удалить из отношения все объекты, которые не характерны для обоих наборов. Это - эквивалент NSMutableSet
метод intersectSet:
.
Пример перечисления 13 -intersect<Key>:
и -set<Key>:
реализации
- (void)intersectTransactions:(NSSet *)otherObjects { |
return [self.transactions intersectSet:otherObjects]; |
} |