๋ธ๋ฆฌ๊ฒ์ดํธ์ ์ ํ์ ๋ฉ์๋(optional method) ๊ตฌํ ์ฌ๋ถ ํ์ธํด๋ณด์
Swift์ Objc์ ํ๋กํ ์ฝ์์ ๋ฉ์๋๋ ํ์, ์ ํ์ ๋ฉ์๋๋ก ๊ตฌํ ๊ฐ๋ฅํ๋ค.
์ ํ์ ๋ฉ์๋(optional method)๋ฅผ ํธ์ถํ๊ธฐ ์ ,
๋ธ๋ฆฌ๊ฒ์ดํธ๊ฐ ํธ์ถํ๋ ์ ํ์์ ์๋ตํ ์ ์๋์ง ํ์ธํ๊ธฐ ์ํด ๋ด์ฑ์ ์ฌ์ฉํด์ผ ํ๋ค.!!!
๊ตฌํํ์ง ์์ ๋ฉ์๋ ํธ์ถ ์ null๊ฐ์ ๋ณด๋ด Crash๊ฐ ๋๊ธฐ ๋๋ฌธ!!! ๐ญ
๋ฐ๋ผ์, ๋ฐ๋์ ํ๋กํ ์ฝ์ ์ต์ ๋ ๋ฉ์๋ ์ฌ์ฉ ์ ๊ตฌํ ์ฌ๋ถ๋ฅผ ํ์ธํ๋ ์ ์ฐจ๋ฅผ ์ํํด์ผํ๋ค. ๐๐ป
โถ Objective-C ํ๋กํ ์ฝ ๋ฉ์๋ ๊ตฌํ ์ฌ๋ถ ํ์ธํ๊ธฐ
์ผ๋จ ObjC ์์ ํ๋กํ ์ฝ์ ์๋ ์ฝ๋์ ๊ฐ์ด
ํค์๋๊ฐ ์๋ ๋ฉ์๋๋ ๋ชจ๋ ํ์์ ์ผ๋ก ๊ตฌํํด์ผ ํ๋ ๋ฉ์๋,
@optional ํค์๋ ๋ค์์ ๋์ค๋ ๋ฉ์๋๋ค์ ๋ชจ๋ ์ ํ์ ์ผ๋ก ๊ตฌํํ๋ฉด ๋๋ ๋ฉ์๋,
@optional ํค์๋๋ก ์ ์ธํ ๋ฉ์๋๋ค ๋ค์ ๋ค์ ํ์ ๋ฉ์๋๋ฅผ ์ถ๊ฐ๋ก ์ ์ธํ๋ ค๋ฉด @required ํค์๋๋ฅผ ๋ค์ ์จ์ค๋๋ค.
@protocol MyProtocol : NSObject
-(void)requiredMethod;
@optional
-(void)anOptionalMethod;
@required
-(void)anotherRequiredMethod;
@end;
๊ทธ๋ผ ๋ค์๊ณผ ๊ฐ์ด @optional ๋ก ์ ์๋ ๋ฉ์๋๋ฅผ ํธ์ถํด๋ด ์๋ค.
@protocol BViewControllerDelegate <NSObject>
@optional
-(void)sendMessage:(NSString*)message;
@end
๊ทธ๋ฆฌ๊ณ ๋ธ๋ฆฌ๊ฒ์ดํธ๊ฐ ํน์ ๋ฉ์๋๋ฅผ ๊ตฌํํ๋์ง ํ์ธํด์ค๋๋ค.
Objective-C์์๋ respondsToSelector: ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ๊ฐ์ฒด์ ๋ฉ์๋ ๊ตฌํ ์ฌ๋ถ๋ฅผ ํ์ธ ๊ฐ๋ฅํฉ๋๋ค.
respondsToSelector:
- (BOOL)respondsToSelector:(SEL)aSelector;
respondsToSelector ๋ฉ์๋ ํ๋ผ๋ฏธํฐ์ @selector(ํ์ธํ ๋ฉ์๋) ๋ฅผ ๋ฃ์ด์ค๋๋ค!
๋ฉ์๋ ๊ตฌํ๋ ๊ฒฝ์ฐ YES๊ฐ ์ถ๋ ฅ, ์์ผ๋ฉด nil๊ฐ์ ๋ณด๋ ๋๋ค.
if (self.delegate && [self.delegate respondsToSelector:@selector(sendMessage:)]) {
[self.delegate sendMessage: _messageField.text];
}
โถ Swift ํ๋กํ ์ฝ ๋ฉ์๋ ๊ตฌํ ์ฌ๋ถ ํ์ธํ๊ธฐ
์๋์ ๊ฐ์ด Swift์์ ์ ํ์ ๋ฉ์๋๊ฐ ์ ์๋๋ฉด,
๋ฉ์๋๋ ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋น ํ์ ์ด ์๋์ผ๋ก ์ต์ ๋์ด ๋ฉ๋๋ค.
์๋ฅผ๋ค์ด, (Int)->Stringํ์ ์ ๋ฉ์๋๋ ((Int)->String)?์ด ๋ฉ๋๋ค.
์ ์ฒด ํจ์ ํ์ ์ ํ์ ์ ๋ฉ์๋์ ๋ฆฌํด๊ฐ์ด ์๋ ์ต์ ๋๋ก ๋ํ๋๊ฒ ๋ฉ๋๋ค.
@objc protocol BViewControllerDelegate {
@objc optional func sendMessage(message: String)
}
๋ฐ๋ผ์, Swift์์๋ respondsToSelector:์ ๊ฐ์ ํธ๋ฆฌํ ๋ฉํ ํ๋ก๊ทธ๋๋ฐ ๋๊ตฌ๊ฐ ์ง์๋์ง ์์ง๋ง,
์ ํ์ ๋ฉ์๋๋ฅผ optional chaining์ ์ฌ์ฉํ์ฌ ํธ์ถํฉ๋๋ค. ๐๐ป
if((self.delegate) != nil){
if let method = self.delegate?.sendMessage?(message: messageField.text!){
method
}
}