Objective-C Generics
Objective-C Generics ๊ด๋ จ
์๋ ํ์ธ์. ๋ชจ๋ฐ์ผ๊ธฐ์ ๊ฐ๋ฐํ ๊นํ๊ฒฝ ์ ๋๋ค.
์ผ๋ง์ ์ WWDC๋ฅผ ํตํด OS X 10.11 ๋ฒ ํ ์ iOS 9 ๋ฒ ํ๊ฐ ๊ณต๊ฐ๋๋ฉด์ XCode 7 ๋ฒ ํ ๋ฒ์ ๋ ํจ๊ป ๊ณต๊ฐ๋์๋๋ฐ์.
XCode 7 ๋ฒ ํ ๋ฒ์ ๋ถํฐ ์ถ๊ฐ๋ Objective-C์ Generics์ ๋ํด์ ๊ฐ๋จํ๊ฒ๋๋ง ๊ณต์ ํด๋ณด๊ณ ์ ํฉ๋๋ค ๐
0. Lightweight Generics
Xcode 7 beta ๋ถํฐ ์ง์ํ๋ฉฐ, Foundation Collection์ ์ ์ฉ๋์ด ์๋ค. (NSArray
, NSMutableArray
, NSSet
, NSMutableSet
, NSOrderedSet
, NSMutableOrderedSet
, NSDictionary
, NSMutableDictionary
, NSHashTable
, NSMapTable
)
1. Syntax
.Objective-C์ Generics๋ ๋ค์๊ณผ ๊ฐ์ด ํํํ ์ ์๋ค.
NSArray<NSString*> *strings = [[NSArray<NSString*> alloc] init];
2. Type check
์ํ๊น๊ฒ๋ Objective-C์ Generics๋ ํ์ ๋งค๊ฐ๋ณ์์ ๋ํ ๊ฒ์ฌ๊ฐ Java๋ C#์ ๋นํด ์๊ฒฉํ์ง ๋ชปํ๋ค.
๋ง์ฝ NSArray
๋ฐฐ์ด์ NSNumber
๊ฐ์ฒด๋ฅผ ๋ด์ผ๋ ค๊ณ ํ๋ฉด ๊ฒฝ๊ณ ๋ง ๋ฐ ๋ฟ ์ปดํ์ผ์ด ์ฑ๊ณตํ๋ค. ์ฌ์ง์ด ์ ์์ ์ผ๋ก ๋์ํ๋ค.
Why?
.Objective-C Generics์ ๊ตฌํ์ id ํ์ ์ ์ด์ฉํ๊ธฐ ๋๋ฌธ์ด๋ค. ์์ธํ๊ฑด ์๋ ๊ตฌํ ์์ ๋ฅผ ์ฐธ๊ณ ํ๋ฉด ๋๋ค.
3. Generics ๊ตฌํ
ํด๋์ค๋ฅผ ์ ์ํ ๋ ๋ค์๊ณผ ๊ฐ์ด ์ ์ํ ์ ์๋ค.
@interface VPStack<__covariant ElemType> : NSObject
-(void)push:(ElemType)element;
-(ElemType)pop;
@end
ํ์ง๋ง ๊ตฌํ๋ถ๋ id
ํ์
์ ์ด์ฉํด ๊ตฌํํ๋ค.
@implementation VPStack
-(instancetype)init {...}
-(void)push:(id)element {...}
-(id)pop {...}
@end
์ด๋ ๊ฒ ๊ตฌํ๋ ํด๋์ค๋ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ค.
VPStack<NSString*>* stack = [[VPStack<NSString*> alloc] init];
[stack push:@"element1"];
[stack push:@1];
์ธ ๋ฒ์งธ ๋ผ์ธ์ฒ๋ผ ์ ์๋ ํ์ ๊ณผ ๋ค๋ฅธ ํ์ ์ ๋ฃ์ ๊ฒฝ์ฐ, ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ๊ณ ๊ฐ ๋ ธ์ถ๋๋ค.
ํ์ง๋ง ๊ตฌํ์ด id
ํ์ผ๋ก ๋์ด์๊ธฐ ๋๋ฌธ์ ์ ์๋์ํ๋ค.
Incompatible pointer types sending 'NSNumber *' to parameter of type 'NSString *'