Значение ключа, кодирующее методы доступа

Для кодирования значения ключа для определения местоположения методов доступа использовать для вызовов 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 или 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>:. Дополнительный. Реализация, если сравнительное тестирование указывает, что производительность является проблемой. Это выполняет эквивалентное действие метода NSSet intersectSet:.

-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];
}