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>>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。