SlideShare a Scribd company logo
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

PPTX
Underscore js
PDF
Ecma script 6 in action
PDF
2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4
PDF
2014.10.15 блиц-доклад PostgreSQL kNN search
PPTX
Поиск наизнанку
PDF
iOS-01-Основы Objective-C
PDF
iOS-03-Управление памятью
PPTX
Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)
Underscore js
Ecma script 6 in action
2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4
2014.10.15 блиц-доклад PostgreSQL kNN search
Поиск наизнанку
iOS-01-Основы Objective-C
iOS-03-Управление памятью
Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)

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

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

More from Noveo (20)

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

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