SlideShare a Scribd company logo
1 of 24
Download to read offline
iOS Internship 2014
Бонусная лекция
Максим Забелин
Бонусная лекцияFoundation
NSCopying, Subscripting, Fast Enumeration
О чем будем говорить
1. Object Subscripting
2. NSCopying, isEqual:, hash
3. NSFastEnumeration
Бонусная лекцияFoundation
NSCopying, Subscripting, Fast Enumeration
Object Subscripting
NSMutableArray *array = [@[@1,@2,@3] mutableCopy];
NSLog(@"%@", array[1]);
array[2] = @"Bla-bla-bla";
NSMutableDictionary *dictionary = [@{@1: @"one", @2: @"two"} mutableCopy];
NSLog(@"%@", dictionary[@1]);
dictionary[@3] = @"three";
Бонусная лекцияFoundation
NSCopying, Subscripting, Fast Enumeration
Object Subscripting
NSMutableArray *array = [@[@1,@2,@3] mutableCopy];
NSLog(@"%@", array[1]);
array[2] = @"Bla-bla-bla";
NSMutableDictionary *dictionary = [@{@1: @"one", @2: @"two"} mutableCopy];
NSLog(@"%@", dictionary[@1]);
dictionary[@3] = @"three";
Бонусная лекцияFoundation
NSCopying, Subscripting, Fast Enumeration
Хотите так же?
Это может быть полезно, если ваш класс
хранит коллекцию элементов (например,
шахматная доска, судоку, граф, …)
// Sudoku *sudoku = ...
NSNumber *number = sudoku[@"1,3"];
// Graph *graph = ...
Vertex *vertex = graph[4];
Бонусная лекцияFoundation
NSCopying, Subscripting, Fast Enumeration
Все сводится к вызову методов
NSMutableArray *array = [@[@1,@2,@3] mutableCopy];
NSLog(@"%@", [array objectAtIndexedSubscript:1]);
[array setObject:@"Bla-bla-bla" atIndexedSubscript:2];
NSMutableDictionary *dictionary = [@{@1: @"one", @2: @"two"} mutableCopy];
NSLog(@"%@", [dictionary objectForKeyedSubscript:@2]);
[dictionary setObject:@"three" forKeyedSubscript:@3];
Бонусная лекцияFoundation
NSCopying, Subscripting, Fast Enumeration
// myObject[idx];
- (id)objectAtIndexedSubscript:(NSUInteger)idx;
// myObject[idx] = obj;
- (void)setObject:(id)obj atIndexedSubscript:(NSUInteger)idx;
// myObject[key];
- (id)objectForKeyedSubscript:(id <NSCopying>)key;
// myObject[key] = obj;
- (void)setObject:(id)obj forKeyedSubscript:(id <NSCopying>)key;
чтобы использовать удобный синтаксис, реализуйте один или несколько методов из приведенных выше
Ага, вот эти методы
Бонусная лекцияFoundation
NSCopying, Subscripting, Fast Enumeration
NSCopying — что это?
Мы его уже встречали 2 раза:
● На прошлом слайде
● У NSDictionary ключ должен
удовлетворять NSCopying
Бонусная лекцияFoundation
NSCopying, Subscripting, Fast Enumeration
Из документации
The NSCopying protocol declares a method for providing functional copies of
an object. The exact meaning of “copy” can vary from class to class, but a copy
must be a functionally independent object with values identical to the original at
the time the copy was made.
NSString и NSNumber поддерживают этот протокол. А
как реализовать его в своем классе?
Бонусная лекцияFoundation
NSCopying, Subscripting, Fast Enumeration
Единственный метод
@protocol NSCopying
- (id)copyWithZone:(NSZone *)zone;
@end
Бонусная лекцияFoundation
NSCopying, Subscripting, Fast Enumeration
Как реализовать?
● Если суперкласс поддерживает
NSCopying, вызывайте
[super copyWithZone:zone];
● Если нет, используйте alloc-init
● Если объект в принципе неизменяемый,
можно вернуть self
Бонусная лекцияFoundation
NSCopying, Subscripting, Fast Enumeration
Пример
@interface Person : NSObject <NSCopying>
@property (copy, nonatomic) NSString *name;
@property (copy, nonatomic) NSString *surname;
@property (copy, nonatomic) NSUInteger age;
@end
@implementation Person
- (id)copyWithZone:(NSZone *)zone {
Person *personCopy = [[Person alloc] init];
personCopy.name = self.name;
personCopy.surname = self.surname;
personCopy.age = self.age;
return personCopy;
}
@end
Бонусная лекцияFoundation
NSCopying, Subscripting, Fast Enumeration
И ради чего это?
Теперь можно использовать класс Person
как ключ в NSDictionary.
Иногда это бывает нужно.
Бонусная лекцияFoundation
NSCopying, Subscripting, Fast Enumeration
Равенство объектов
Есть много ситуаций, когда требуется
проверить, равны объекты или нет. Например:
● когда добавляем пару ключ:значение в
dictionary
● когда добавляем элемент в множество
● когда ищем объект (indexOfObject: у
NSArray)
Бонусная лекцияFoundation
NSCopying, Subscripting, Fast Enumeration
NSObject
Для этих проверок у NSObject есть 2
метода:
- (NSUInteger)hash;
- (BOOL)isEqual:(id)object;
Бонусная лекцияFoundation
NSCopying, Subscripting, Fast Enumeration
hash
Хэш — это число.
Если хэши различны, объекты точно не
совпадают.
Если одинаковы — неизвестно. Тогда можно
проверить с помощью метода -isEqual:.
Бонусная лекцияFoundation
NSCopying, Subscripting, Fast Enumeration
isEqual:
в NSObject isEqual: реализован так:
- (BOOL)isEqual:(id)other
{
return self == other;
}
Т.е. объект эквивалентен только сам себе.
Если это не то, что мы хотим, нужно самому
переопределить этот метод.
Бонусная лекцияFoundation
NSCopying, Subscripting, Fast Enumeration
Как реализовать их самому?
На эту тему есть хорошая статья.
Бонусная лекцияFoundation
NSCopying, Subscripting, Fast Enumeration
Если коротко
1. isEqual: — обычно достаточно проверить на
равенство все свойства
- (BOOL)isEqual:(id)other
{
if (![other isKindOfClass:[self class]])
return NO;
return
([[other name] isEqualToString:self.name] &&
[[other surname] isEqualToString:self.surname] &&
[other age] == self.age);
}
Бонусная лекцияFoundation
NSCopying, Subscripting, Fast Enumeration
2. hash — можно взять хэши от всех свойств
и поксорить их.
- (NSUInteger)hash {
return
[self.name hash] ^
[self.surname hash] ^
self.age;
}
(Однако это может быть не самый лучший способ — см. статью)
Бонусная лекцияFoundation
NSCopying, Subscripting, Fast Enumeration
И самое главное
Если вы переопределили -isEqual:,
обязательно нужно переопределить hash.
Бонусная лекцияFoundation
NSCopying, Subscripting, Fast Enumeration
1. Можно использовать объекты своего
класса в циклах for-in
2. Если хорошо реализовать, можно
получить выигрыш в скорости
3. Но это все сложно + очень-очень редко
нужно, поэтому изучайте сами :)
NSFastEnumeration
Бонусная лекцияFoundation
NSCopying, Subscripting, Fast Enumeration
NSFastEnumeration protocol
- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state
objects:(id __unsafe_unretained [])buffer
count:(NSUInteger)len;
Бонусная лекцияFoundation
NSCopying, Subscripting, Fast Enumeration
Дополнительно
1. http://nshipster.com/object-subscripting/
2. https://www.mikeash.com/pyblog/friday-qa-
2010-06-18-implementing-equality-and-
hashing.html

More Related Content

Similar to 11 ns copying, subscripting, fast enumeration

Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий solit
 
03 коллекции
03   коллекции03   коллекции
03 коллекцииNoveo
 
Поговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языкаПоговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языкаAlexander Kucherenko
 
Next Gen Applications
Next Gen ApplicationsNext Gen Applications
Next Gen ApplicationsVittorio Cioe
 
парадигмы программирования и шаблоны проектирования
парадигмы программирования и шаблоны проектированияпарадигмы программирования и шаблоны проектирования
парадигмы программирования и шаблоны проектированияmoldovaictsummit2016
 
ОПК № 5 – Составные типы данных, списки
ОПК № 5 – Составные типы данных, спискиОПК № 5 – Составные типы данных, списки
ОПК № 5 – Составные типы данных, спискиVladimir Parfinenko
 
Active Record for CoreData
Active Record for CoreDataActive Record for CoreData
Active Record for CoreDataDmitriy Kuragin
 
Новости Global summit 2015
Новости Global summit 2015Новости Global summit 2015
Новости Global summit 2015Timur Safin
 
Школа-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с даннымиШкола-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с даннымиГлеб Тарасов
 
Kvc, kvo
Kvc, kvoKvc, kvo
Kvc, kvoNoveo
 

Similar to 11 ns copying, subscripting, fast enumeration (14)

Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
 
03 коллекции
03   коллекции03   коллекции
03 коллекции
 
Поговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языкаПоговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языка
 
Next Gen Applications
Next Gen ApplicationsNext Gen Applications
Next Gen Applications
 
парадигмы программирования и шаблоны проектирования
парадигмы программирования и шаблоны проектированияпарадигмы программирования и шаблоны проектирования
парадигмы программирования и шаблоны проектирования
 
ОПК № 5 – Составные типы данных, списки
ОПК № 5 – Составные типы данных, спискиОПК № 5 – Составные типы данных, списки
ОПК № 5 – Составные типы данных, списки
 
Funny JS #2
Funny JS #2Funny JS #2
Funny JS #2
 
Active Record for CoreData
Active Record for CoreDataActive Record for CoreData
Active Record for CoreData
 
In the sun.misc.Unsafe bowels
In the sun.misc.Unsafe bowelsIn the sun.misc.Unsafe bowels
In the sun.misc.Unsafe bowels
 
Новости Global summit 2015
Новости Global summit 2015Новости Global summit 2015
Новости Global summit 2015
 
Talks on collections
Talks on collectionsTalks on collections
Talks on collections
 
msumobi2. Лекция 1
msumobi2. Лекция 1msumobi2. Лекция 1
msumobi2. Лекция 1
 
Школа-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с даннымиШкола-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с данными
 
Kvc, kvo
Kvc, kvoKvc, kvo
Kvc, kvo
 

More from Noveo

Гуманитарные специальности в IT-индустрии
Гуманитарные специальности в IT-индустрииГуманитарные специальности в IT-индустрии
Гуманитарные специальности в IT-индустрииNoveo
 
Box model, display and position (HTML5 тема 07 - box model, display position)
Box model, display and position (HTML5 тема 07 - box model, display position)Box model, display and position (HTML5 тема 07 - box model, display position)
Box model, display and position (HTML5 тема 07 - box model, display position)Noveo
 
Стилизация текста (HTML5 тема 05 - стилизация текста)
Стилизация текста (HTML5 тема 05 - стилизация текста)Стилизация текста (HTML5 тема 05 - стилизация текста)
Стилизация текста (HTML5 тема 05 - стилизация текста)Noveo
 
Семантика текста (HTML5 тема 04 - семантика текста)
Семантика текста (HTML5 тема 04 - семантика текста)Семантика текста (HTML5 тема 04 - семантика текста)
Семантика текста (HTML5 тема 04 - семантика текста)Noveo
 
Основы CSS (HTML5 тема 02 - основы CSS)
Основы CSS (HTML5 тема 02 - основы CSS)Основы CSS (HTML5 тема 02 - основы CSS)
Основы CSS (HTML5 тема 02 - основы CSS)Noveo
 
Структура HTML документа (HTML5 тема 01 - структура html документа)
Структура HTML документа (HTML5 тема 01 - структура html документа)Структура HTML документа (HTML5 тема 01 - структура html документа)
Структура HTML документа (HTML5 тема 01 - структура html документа)Noveo
 
Yii2
Yii2Yii2
Yii2Noveo
 
Сессии и авторизация
Сессии и авторизацияСессии и авторизация
Сессии и авторизацияNoveo
 
Rest
RestRest
RestNoveo
 
PHP basic
PHP basicPHP basic
PHP basicNoveo
 
PHP Advanced
PHP AdvancedPHP Advanced
PHP AdvancedNoveo
 
PHP and MySQL
PHP and MySQLPHP and MySQL
PHP and MySQLNoveo
 
MySQL
MySQLMySQL
MySQLNoveo
 
Push Notifications (Lecture 22 – push notifications)
Push Notifications (Lecture 22 – push notifications)Push Notifications (Lecture 22 – push notifications)
Push Notifications (Lecture 22 – push notifications)Noveo
 
RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)Noveo
 
Работа с соцсетями (Lecture 19 – social)
Работа с соцсетями (Lecture 19 – social)Работа с соцсетями (Lecture 19 – social)
Работа с соцсетями (Lecture 19 – social)Noveo
 
Работа с геоданными (Lecture 18 – geolocation)
Работа с геоданными (Lecture 18 – geolocation)Работа с геоданными (Lecture 18 – geolocation)
Работа с геоданными (Lecture 18 – geolocation)Noveo
 
Animations (Lecture 17 – animations)
Animations (Lecture 17 – animations)Animations (Lecture 17 – animations)
Animations (Lecture 17 – animations)Noveo
 
Toolbar (Lecture 16 – toolbar)
Toolbar (Lecture 16 – toolbar)Toolbar (Lecture 16 – toolbar)
Toolbar (Lecture 16 – toolbar)Noveo
 
Material Design (Lecture 15 – material design)
Material Design (Lecture 15 – material design)Material Design (Lecture 15 – material design)
Material Design (Lecture 15 – material design)Noveo
 

More from Noveo (20)

Гуманитарные специальности в IT-индустрии
Гуманитарные специальности в IT-индустрииГуманитарные специальности в IT-индустрии
Гуманитарные специальности в IT-индустрии
 
Box model, display and position (HTML5 тема 07 - box model, display position)
Box model, display and position (HTML5 тема 07 - box model, display position)Box model, display and position (HTML5 тема 07 - box model, display position)
Box model, display and position (HTML5 тема 07 - box model, display position)
 
Стилизация текста (HTML5 тема 05 - стилизация текста)
Стилизация текста (HTML5 тема 05 - стилизация текста)Стилизация текста (HTML5 тема 05 - стилизация текста)
Стилизация текста (HTML5 тема 05 - стилизация текста)
 
Семантика текста (HTML5 тема 04 - семантика текста)
Семантика текста (HTML5 тема 04 - семантика текста)Семантика текста (HTML5 тема 04 - семантика текста)
Семантика текста (HTML5 тема 04 - семантика текста)
 
Основы CSS (HTML5 тема 02 - основы CSS)
Основы CSS (HTML5 тема 02 - основы CSS)Основы CSS (HTML5 тема 02 - основы CSS)
Основы CSS (HTML5 тема 02 - основы CSS)
 
Структура HTML документа (HTML5 тема 01 - структура html документа)
Структура HTML документа (HTML5 тема 01 - структура html документа)Структура HTML документа (HTML5 тема 01 - структура html документа)
Структура HTML документа (HTML5 тема 01 - структура html документа)
 
Yii2
Yii2Yii2
Yii2
 
Сессии и авторизация
Сессии и авторизацияСессии и авторизация
Сессии и авторизация
 
Rest
RestRest
Rest
 
PHP basic
PHP basicPHP basic
PHP basic
 
PHP Advanced
PHP AdvancedPHP Advanced
PHP Advanced
 
PHP and MySQL
PHP and MySQLPHP and MySQL
PHP and MySQL
 
MySQL
MySQLMySQL
MySQL
 
Push Notifications (Lecture 22 – push notifications)
Push Notifications (Lecture 22 – push notifications)Push Notifications (Lecture 22 – push notifications)
Push Notifications (Lecture 22 – push notifications)
 
RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)
 
Работа с соцсетями (Lecture 19 – social)
Работа с соцсетями (Lecture 19 – social)Работа с соцсетями (Lecture 19 – social)
Работа с соцсетями (Lecture 19 – social)
 
Работа с геоданными (Lecture 18 – geolocation)
Работа с геоданными (Lecture 18 – geolocation)Работа с геоданными (Lecture 18 – geolocation)
Работа с геоданными (Lecture 18 – geolocation)
 
Animations (Lecture 17 – animations)
Animations (Lecture 17 – animations)Animations (Lecture 17 – animations)
Animations (Lecture 17 – animations)
 
Toolbar (Lecture 16 – toolbar)
Toolbar (Lecture 16 – toolbar)Toolbar (Lecture 16 – toolbar)
Toolbar (Lecture 16 – toolbar)
 
Material Design (Lecture 15 – material design)
Material Design (Lecture 15 – material design)Material Design (Lecture 15 – material design)
Material Design (Lecture 15 – material design)
 

11 ns copying, subscripting, fast enumeration

  • 1. iOS Internship 2014 Бонусная лекция Максим Забелин
  • 2. Бонусная лекцияFoundation NSCopying, Subscripting, Fast Enumeration О чем будем говорить 1. Object Subscripting 2. NSCopying, isEqual:, hash 3. NSFastEnumeration
  • 3. Бонусная лекцияFoundation NSCopying, Subscripting, Fast Enumeration Object Subscripting NSMutableArray *array = [@[@1,@2,@3] mutableCopy]; NSLog(@"%@", array[1]); array[2] = @"Bla-bla-bla"; NSMutableDictionary *dictionary = [@{@1: @"one", @2: @"two"} mutableCopy]; NSLog(@"%@", dictionary[@1]); dictionary[@3] = @"three";
  • 4. Бонусная лекцияFoundation NSCopying, Subscripting, Fast Enumeration Object Subscripting NSMutableArray *array = [@[@1,@2,@3] mutableCopy]; NSLog(@"%@", array[1]); array[2] = @"Bla-bla-bla"; NSMutableDictionary *dictionary = [@{@1: @"one", @2: @"two"} mutableCopy]; NSLog(@"%@", dictionary[@1]); dictionary[@3] = @"three";
  • 5. Бонусная лекцияFoundation NSCopying, Subscripting, Fast Enumeration Хотите так же? Это может быть полезно, если ваш класс хранит коллекцию элементов (например, шахматная доска, судоку, граф, …) // Sudoku *sudoku = ... NSNumber *number = sudoku[@"1,3"]; // Graph *graph = ... Vertex *vertex = graph[4];
  • 6. Бонусная лекцияFoundation NSCopying, Subscripting, Fast Enumeration Все сводится к вызову методов NSMutableArray *array = [@[@1,@2,@3] mutableCopy]; NSLog(@"%@", [array objectAtIndexedSubscript:1]); [array setObject:@"Bla-bla-bla" atIndexedSubscript:2]; NSMutableDictionary *dictionary = [@{@1: @"one", @2: @"two"} mutableCopy]; NSLog(@"%@", [dictionary objectForKeyedSubscript:@2]); [dictionary setObject:@"three" forKeyedSubscript:@3];
  • 7. Бонусная лекцияFoundation NSCopying, Subscripting, Fast Enumeration // myObject[idx]; - (id)objectAtIndexedSubscript:(NSUInteger)idx; // myObject[idx] = obj; - (void)setObject:(id)obj atIndexedSubscript:(NSUInteger)idx; // myObject[key]; - (id)objectForKeyedSubscript:(id <NSCopying>)key; // myObject[key] = obj; - (void)setObject:(id)obj forKeyedSubscript:(id <NSCopying>)key; чтобы использовать удобный синтаксис, реализуйте один или несколько методов из приведенных выше Ага, вот эти методы
  • 8. Бонусная лекцияFoundation NSCopying, Subscripting, Fast Enumeration NSCopying — что это? Мы его уже встречали 2 раза: ● На прошлом слайде ● У NSDictionary ключ должен удовлетворять NSCopying
  • 9. Бонусная лекцияFoundation NSCopying, Subscripting, Fast Enumeration Из документации The NSCopying protocol declares a method for providing functional copies of an object. The exact meaning of “copy” can vary from class to class, but a copy must be a functionally independent object with values identical to the original at the time the copy was made. NSString и NSNumber поддерживают этот протокол. А как реализовать его в своем классе?
  • 10. Бонусная лекцияFoundation NSCopying, Subscripting, Fast Enumeration Единственный метод @protocol NSCopying - (id)copyWithZone:(NSZone *)zone; @end
  • 11. Бонусная лекцияFoundation NSCopying, Subscripting, Fast Enumeration Как реализовать? ● Если суперкласс поддерживает NSCopying, вызывайте [super copyWithZone:zone]; ● Если нет, используйте alloc-init ● Если объект в принципе неизменяемый, можно вернуть self
  • 12. Бонусная лекцияFoundation NSCopying, Subscripting, Fast Enumeration Пример @interface Person : NSObject <NSCopying> @property (copy, nonatomic) NSString *name; @property (copy, nonatomic) NSString *surname; @property (copy, nonatomic) NSUInteger age; @end @implementation Person - (id)copyWithZone:(NSZone *)zone { Person *personCopy = [[Person alloc] init]; personCopy.name = self.name; personCopy.surname = self.surname; personCopy.age = self.age; return personCopy; } @end
  • 13. Бонусная лекцияFoundation NSCopying, Subscripting, Fast Enumeration И ради чего это? Теперь можно использовать класс Person как ключ в NSDictionary. Иногда это бывает нужно.
  • 14. Бонусная лекцияFoundation NSCopying, Subscripting, Fast Enumeration Равенство объектов Есть много ситуаций, когда требуется проверить, равны объекты или нет. Например: ● когда добавляем пару ключ:значение в dictionary ● когда добавляем элемент в множество ● когда ищем объект (indexOfObject: у NSArray)
  • 15. Бонусная лекцияFoundation NSCopying, Subscripting, Fast Enumeration NSObject Для этих проверок у NSObject есть 2 метода: - (NSUInteger)hash; - (BOOL)isEqual:(id)object;
  • 16. Бонусная лекцияFoundation NSCopying, Subscripting, Fast Enumeration hash Хэш — это число. Если хэши различны, объекты точно не совпадают. Если одинаковы — неизвестно. Тогда можно проверить с помощью метода -isEqual:.
  • 17. Бонусная лекцияFoundation NSCopying, Subscripting, Fast Enumeration isEqual: в NSObject isEqual: реализован так: - (BOOL)isEqual:(id)other { return self == other; } Т.е. объект эквивалентен только сам себе. Если это не то, что мы хотим, нужно самому переопределить этот метод.
  • 18. Бонусная лекцияFoundation NSCopying, Subscripting, Fast Enumeration Как реализовать их самому? На эту тему есть хорошая статья.
  • 19. Бонусная лекцияFoundation NSCopying, Subscripting, Fast Enumeration Если коротко 1. isEqual: — обычно достаточно проверить на равенство все свойства - (BOOL)isEqual:(id)other { if (![other isKindOfClass:[self class]]) return NO; return ([[other name] isEqualToString:self.name] && [[other surname] isEqualToString:self.surname] && [other age] == self.age); }
  • 20. Бонусная лекцияFoundation NSCopying, Subscripting, Fast Enumeration 2. hash — можно взять хэши от всех свойств и поксорить их. - (NSUInteger)hash { return [self.name hash] ^ [self.surname hash] ^ self.age; } (Однако это может быть не самый лучший способ — см. статью)
  • 21. Бонусная лекцияFoundation NSCopying, Subscripting, Fast Enumeration И самое главное Если вы переопределили -isEqual:, обязательно нужно переопределить hash.
  • 22. Бонусная лекцияFoundation NSCopying, Subscripting, Fast Enumeration 1. Можно использовать объекты своего класса в циклах for-in 2. Если хорошо реализовать, можно получить выигрыш в скорости 3. Но это все сложно + очень-очень редко нужно, поэтому изучайте сами :) NSFastEnumeration
  • 23. Бонусная лекцияFoundation NSCopying, Subscripting, Fast Enumeration NSFastEnumeration protocol - (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id __unsafe_unretained [])buffer count:(NSUInteger)len;
  • 24. Бонусная лекцияFoundation NSCopying, Subscripting, Fast Enumeration Дополнительно 1. http://nshipster.com/object-subscripting/ 2. https://www.mikeash.com/pyblog/friday-qa- 2010-06-18-implementing-equality-and- hashing.html