Swift Protocol optional
Objective-C中实现Protocol的可选直接使用关键字@Optional就好了。 然而在Swift中就变的比较绕了。 ==================Swift2.0之前======================== swift实际不提供可选协议,但是为了对接Objective-C,没办法就使用@objc + optional来达到目的。 具体实例参考如下:
@objc protocol TestProtocol { func sayHello() optional func sayName(name:String) } 在声明一个类来实现它
class TestProtocolClass:NSObject,TestProtocol {
func sayHello() { NSLog("say hello") }
//func sayName(name: String) { // NSLog("name = %s",name) //} } 但是问题来了,如果TestProtocolClass不是继承自NSObject,那就要在类中每个协议方法的实现前加上@objc了。如下
class TestProtocolClass:TestProtocol {
@objc func sayHello() { NSLog("say hello") }
@objc func sayName(name: String) { NSLog("name = %s",name) } } 可谓好繁琐啊~~, 并且被@objc修饰,这个协议只能被Class遵循,结构体跟枚举就无缘了,对Swift也不优雅。 如何解决往下看。。。 =========================Swift2.0之后====================== 2.0之后,为了实现Protocol的可选并且兼容结构体枚举,可以通过extension关键字给协议添加默认实现来达到目的。
protocol TestProtocol2 { func sayHello() func sayName(name:String) } extension TestProtocol2 { func sayName(name:String) { NSLog("protocol 2 say Name = %s",name) } } struct TestProtocol2Struct : TestProtocol2{ func sayHello() { NSLog("struct hello") } func sayName(name: String) { NSLog("struct say name = %@",name) } } class TestProtocol2Class:TestProtocol2 { func sayHello() { NSLog("2 say hello") } func sayName(name: String) { NSLog("2 say Name = %@",name) }
}
注:参考资料 喵神的<<100个Swift必备的Tips>> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |