Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«iOS. ΠŸΡ€ΠΈΠ΅ΠΌΡ‹ программирования». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 8

Автор Π’Π°Π½Π΄Π°Π΄ Нахавандипур

__unused NSString *lastName = [dictionary valueForKey: kLastNameKey];

Но с Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΠ΅ΠΌ компилятора LLVM этот ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ, ΠΏΡ€ΠΈΠ΄Π°Π² Π΅ΠΌΡƒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²ΠΈΠ΄:

NSString *const kFirstNameKey = @"firstName";

NSString *const kLastNameKey = @"lastName";


NSDictionary *dictionary = @{

kFirstNameKey: @"Tim",

kLastNameKey: @"Cook",

};


__unused NSString *firstName = dictionary[kFirstNameKey];

__unused NSString *lastName = dictionary[kLastNameKey];

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, ΠΌΡ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ, давая ΠΊΠ»ΡŽΡ‡ΠΈ Π² Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ… скобках. Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ ΠΈ с массивами. Π’ΠΎΡ‚ ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ создаСм ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ массивы:

NSArray *array = [[NSArray alloc] initWithObjects:@"Tim", @"Cook", nil];

__unused NSString *firstItem = [array objectAtIndex:0];

__unused NSString *secondObject = [array objectAtIndex:1];

А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ, имСя Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ΄ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ этот ΠΊΠΎΠ΄ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

NSArray *array = @[@"Tim", @"Cook"];

__unused NSString *firstItem = array[0];

__unused NSString *secondObject = array[0];


ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ LLVM Π½Π΅ останавливаСтся ΠΈ Π½Π° этом. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ подписываниС ΠΈ ΠΊ собствСнным классам. БущСствуСт Π΄Π²Π° Ρ‚ΠΈΠΏΠ° подписывания:

подписываниС ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ β€” дСйствуя Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для Ρ‚ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π° Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ Π²Ρ‹ Π΄Π΅Π»Π°Π»ΠΈ Π±Ρ‹ это Π² словарС. Указывая ΠΊΠ»ΡŽΡ‡, Π²Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ доступ ΠΊ значСниям Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΡ…;

 ΠΏΠΎΠ΄ΠΏΠΈΡΡ‹Π²Π°Π½ΠΈΠ΅ ΠΏΠΎ индСксу β€” ΠΊΠ°ΠΊ ΠΈ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с массивами, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ/ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ значСния Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, прСдоставив для этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° индСкс. Π­Ρ‚ΠΎ цСлСсообразно Π΄Π΅Π»Π°Ρ‚ΡŒ Π² массивоподобных классах, Π³Π΄Π΅ элСмСнты СстСствСнным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ΡΡ Π² порядкС, ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΌ для индСксирования.

Π‘Π½Π°Ρ‡Π°Π»Π° рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ подписывания ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ. Для этого создадим класс ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Person, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉ свойства firstName ΠΈ lastName. Π”Π°Π»Π΅Π΅ ΠΌΡ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠΌ программисту ΠΌΠ΅Π½ΡΡ‚ΡŒ значСния этих свойств (имя ΠΈ Ρ„Π°ΠΌΠΈΠ»ΠΈΡŽ), просто прСдоставив ΠΊΠ»ΡŽΡ‡ΠΈ для этих свойств.

Π’Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊ классу ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ подписывания ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅: ΠΈΠΌΠ΅Π½Π° Π²Π°ΡˆΠΈΡ… свойств ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΈ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ программисту Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ значСния Ρ‚Π°ΠΊΠΈΡ… свойств, Π½Π΅ учитывая, Π±ΡƒΠ΄ΡƒΡ‚ Π»ΠΈ ΠΈΠΌΠ΅Π½Π° этих свойств впослСдствии ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС программисту Π»ΡƒΡ‡ΡˆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ свойства Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ. Другая ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ подписывания ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ β€” стрСмлСниС ΡΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ‚ΠΎΡ‡Π½ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ/объявлСниС Π²Π°ΡˆΠΈΡ… свойств ΠΎΡ‚ программиста ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ программисту прямой доступ ΠΊ этим свойствам.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ подписывания ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ Π² Π²Π°ΡˆΠΈΡ… собствСнных классах, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² вашСм классС Π΄Π²Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΈ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ сигнатуры ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π² Ρ„Π°ΠΉΠ»Π΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² этого класса. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС компилятор Π½Π΅ ΡƒΠ·Π½Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π² вашСм классС поддСрТиваСтся подписываниС ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ.


#import <Foundation/Foundation.h>


/* ΠœΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… ΠΊΠ°ΠΊ ΠΊΠ»ΡŽΡ‡ΠΈ для Π½Π°ΡˆΠΈΡ… свойств firstName

ΠΈ lastName, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Ссли ΠΈΠΌΠ΅Π½Π° Π½Π°ΡˆΠΈΡ… свойств firstName ΠΈ lastName

Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ измСнятся Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, Π½Π°ΠΌ Π½Π΅ ΠΏΡ€ΠΈΠ΄Π΅Ρ‚ся Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π΅Π»Ρ‹Π²Π°Ρ‚ΡŒ

ΠΈ наш класс останСтся работоспособным, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ ΡΠΌΠΎΠΆΠ΅ΠΌ просто

ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ значСния этих констант Π² нашСм Ρ„Π°ΠΉΠ»Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ */

extern NSString *const kFirstNameKey;

extern NSString *const kLastNameKey;


@interface Person: NSObject


@property (nonatomic, copy) NSString *firstName;

@property (nonatomic, copy) NSString *lastName;


β€” (id) objectForKeyedSubscript:(id<NSCopying>)paramKey;

β€” (void) setObject:(id)paramObject forKeyedSubscript:(id<NSCopying>)paramKey;


@end


ΠœΠ΅Ρ‚ΠΎΠ΄ objectForKeyedSubscript: Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ Π² вашСм классС всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° программист прСдоставит ΠΊΠ»ΡŽΡ‡ ΠΈ Π·Π°Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π² вашСм классС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ Π΄Π°Π½Π½ΠΎΠΌΡƒ ΠΊΠ»ΡŽΡ‡Ρƒ. ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‚ΠΎΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π²Π°ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½, Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ собой ΠΊΠ»ΡŽΡ‡, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ программист Ρ…ΠΎΡ‡Π΅Ρ‚ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‰Π΅Π΅ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊ этому ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π² нашСм классС ΠΌΠ΅Ρ‚ΠΎΠ΄ setObject: forKeyedSubscript: всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° программист Π·Π°Ρ…ΠΎΡ‡Π΅Ρ‚ Π·Π°Π΄Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π°. Π˜Ρ‚Π°ΠΊ, Π² Π΄Π°Π½Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, ассоциированы Π»ΠΈ Π·Π°Π΄Π°Π½Π½Ρ‹Π΅ ΠΊΠ»ΡŽΡ‡ΠΈ с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΈ фамилиями. Если это Ρ‚Π°ΠΊ, Ρ‚ΠΎ собираСмся ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ/ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π² нашСм классС значСния ΠΈΠΌΠ΅Π½ΠΈ ΠΈ Ρ„Π°ΠΌΠΈΠ»ΠΈΠΈ:


#import Β«Person.hΒ»


NSString *const kFirstNameKey = @"firstName";

NSString *const kLastNameKey = @"lastName";


@implementation Person


β€” (id) objectForKeyedSubscript:(id<NSCopying>)paramKey{


NSObject<NSCopying> *keyAsObject = (NSObject<NSCopying> *)paramKey;

if ([keyAsObject isKindOfClass: [NSString class]]){

NSString *keyAsString = (NSString *)keyAsObject;

if ([keyAsString isEqualToString: kFirstNameKey] ||

[keyAsString isEqualToString: kLastNameKey]){

return [self valueForKey: keyAsString];

}

}


return nil;

}


β€” (void) setObject:(id)paramObject forKeyedSubscript:(id<NSCopying>)paramKey{

NSObject<NSCopying> *keyAsObject = (NSObject<NSCopying> *)paramKey;

if ([keyAsObject isKindOfClass: [NSString class]]){

NSString *keyAsString = (NSString *)keyAsObject;

if ([keyAsString isEqualToString: kFirstNameKey] ||

[keyAsString isEqualToString: kLastNameKey]){

[self setValue: paramObject forKey: keyAsString];

}

}

}


@end


Π˜Ρ‚Π°ΠΊ, Π² этом ΠΊΠΎΠ΄Π΅ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΊΠ»ΡŽΡ‡ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ objectForKeyedSubscript:, Π° Π² ΠΎΡ‚Π²Π΅Ρ‚ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ассоциирован Π² нашСм экзСмплярС с этим ΠΊΠ»ΡŽΡ‡ΠΎΠΌ. ΠšΠ»ΡŽΡ‡, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ, β€” это ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρƒ NSCopying. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ копию Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. РассчитываСм Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΊΠ»ΡŽΡ‡ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ собой строку, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ с Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΌΠΈ ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ Π·Π°Ρ€Π°Π½Π΅Π΅ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ Π² Π½Π°Ρ‡Π°Π»Π΅ класса. Π’ случаС совпадСния Π·Π°Π΄Π°Π΄ΠΈΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΠΎΠ³ΠΎ свойства Π² этом классС. ПослС этого Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ valueForKey:, относящимся ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ NSObject, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ассоциированноС с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ. Но, разумССтся, ΠΏΡ€Π΅ΠΆΠ΄Π΅, Ρ‡Π΅ΠΌ Ρ‚Π°ΠΊ ΠΏΠΎΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ β€” ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Ρ‚Π΅Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ. Π’ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ setObject: forKeyedSubscript: ΠΌΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΠ΅ β€” устанавливаСм значСния для Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π°, Π° Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ ΠΈΡ….

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π² любой части вашСго прилоТСния Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠ½ΡΡ‚Π°Π½Ρ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° Person ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π·Π°Ρ€Π°Π½Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ΠΊΠ»ΡŽΡ‡ΠΈ kFirstNameKey ΠΈ kLastNameKey, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ значСния свойств firstName ΠΈ lastName, Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:


Person *person = [Person new];

person[kFirstNameKey] = @"Tim";

person[kLastNameKey] = @"Cook";

__unused NSString *firstName = person[kFirstNameKey];

__unused NSString *lastName = person[kLastNameKey];

Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ позволяСт Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°, Ρ‡Ρ‚ΠΎ ΠΈ ΠΏΡ€ΠΈ Π±ΠΎΠ»Π΅Π΅ Π»ΠΎΠ±ΠΎΠ²ΠΎΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ устанавливаСм свойства класса:

Person *person = [Person new];

person.firstName = @"Tim";

person.lastName = @"Cook";

__unused NSString *firstName = person.firstName;

__unused NSString *lastName = person.lastName;


Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΈ подписываниС ΠΏΠΎ индСксу β€” Ρ‚ΠΎΡ‡Π½ΠΎ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с массивами. Как Π±Ρ‹Π»ΠΎ ΡƒΠΊΠ°Π·Π°Π½ΠΎ Ρ€Π°Π½Π΅Π΅, это ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ программисту доступ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ, выстраиваСмым Π² классС Π² Π½Π΅ΠΊΠΎΠ΅ΠΌ СстСствСнном порядкС. Но, ΠΊΡ€ΠΎΠΌΠ΅ массивов, сущСствуСт Π½Π΅ Ρ‚Π°ΠΊ ΡƒΠΆ ΠΌΠ½ΠΎΠ³ΠΎ структур Π΄Π°Π½Π½Ρ‹Ρ…, Π³Π΄Π΅ цСлСсообразно ΡƒΠΏΠΎΡ€ΡΠ΄ΠΎΡ‡ΠΈΠ²Π°Ρ‚ΡŒ ΠΈ Π½ΡƒΠΌΠ΅Ρ€ΠΎΠ²Π°Ρ‚ΡŒ элСмСнты, Ρ‡Π΅Π³ΠΎ Π½Π΅ скаТСшь ΠΎ подписывании ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ примСняСтся Π² самых Ρ€Π°Π·Π½Ρ‹Ρ… структурах Π΄Π°Π½Π½Ρ‹Ρ…. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ подписываниС ΠΏΠΎ индСксу, Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π½Π°Π΄ΡƒΠΌΠ°Π½. Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Ρƒ нас сущСствовал класс Person с ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΈ Ρ„Π°ΠΌΠΈΠ»ΠΈΠ΅ΠΉ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ программистам Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ имя, указывая индСкс 0, Π° Ρ„Π°ΠΌΠΈΠ»ΠΈΡŽ β€” указывая индСкс 1. ВсС, Ρ‡Ρ‚ΠΎ трСбуСтся ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ для этого, β€” ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ objectAtIndexedSubscript: ΠΈ setObject: atIndexedSubscript: Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ класса, Π° Π·Π°Ρ‚Π΅ΠΌ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ. Π’ΠΎΡ‚ ΠΊΠ°ΠΊ ΠΌΡ‹ объявляСм Π΄Π²Π° этих ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ класса Person:

β€” (id) objectAtIndexedSubscript:(NSUInteger)paramIndex;

β€” (void) setObject:(id)paramObject atIndexedSubscript:(NSUInteger)paramIndex;

РСализация Ρ‚Π°ΠΊΠΆΠ΅ довольно проста. ΠœΡ‹ Π±Π΅Ρ€Π΅ΠΌ индСкс ΠΈ ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ ΠΈΠΌ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ это трСбуСтся Π² нашСм классС. Π Π°Π½Π΅Π΅ ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ Ρƒ ΠΈΠΌΠ΅Π½ΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ индСкс 0, Π° Ρƒ Ρ„Π°ΠΌΠΈΠ»ΠΈΠΈ β€” индСкс 1. Π˜Ρ‚Π°ΠΊ, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ индСкс 0 для задания значСния, присваиваСм Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ входящСму ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ ΠΈ Ρ‚. Π΄.:


β€” (id) objectAtIndexedSubscript:(NSUInteger)paramIndex{


switch (paramIndex){

case 0:{

return self.firstName;

break;

}

case 1:{

return self.lastName;

break;

}

default:{

[NSException raise:@"Invalid index" format: nil];

}

}


return nil;

}


β€” (void) setObject:(id)paramObject atIndexedSubscript:(NSUInteger)paramIndex{