[iOS] respondsToSelector, μ΅μ λ 체μ΄λ μ¬μ©νμ¬ λΈλ¦¬κ²μ΄νΈμ μ νμ λ©μλ(optional method) ꡬν μ¬λΆ νμΈνκΈ° (in Swift, Objective-C)
λΈλ¦¬κ²μ΄νΈμ μ νμ λ©μλ(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
}
}