Swift Protocol optional

2 篇文章 0 订阅

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内部实现中没有实现sayName方法,编译也不会报错,可算是实现了协议可选。

但是问题来了,如果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)

    }

    

}


虽然2.0把解决方法集中放到了协议的扩展上,既解决了兼容分散,又实现了协议方法可选,但是但是。。。这种形式看着也不怎么优雅啊~~

注:参考资料

喵神的<<100个Swift必备的Tips>>



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值