Protocol 与 NSObject 的情与恨

Protocol 的使用在 Swift 的世界里变得简单而复杂

定义一个 protocol 是这样的

protocol XXX {
    func hello()
}

使用一个 Protocol 创建一个类是这样的

class XXXObject: XXX {
    func hello() { }
}

但是,如果你需要在一个 delegate 属性中声明它属于哪一个 Protocol, 是不行的,必须指定一个类作为类型。

class YYY {
    weak var delegate: XXX? // 编译器报错,不能这样定义
}

所有的 Protocol 类都继承 XXXObject 就可以了

class YYY {
    weak var delegate: XXXObject? // 换成这样就好了
}

但我仍然觉得是一个坑,一个类理论上应该可以遵丛多个协议,所以,一旦离开了 NSObject, 这也就变成一个坑。

回到 NSObject 的世界,Protocol的可读性就变得高起来了

protocol XXX: NSObjectProtocol {
    func hello()
}

class XXXObject: NSObject, XXX {
    func hello() { }
}

class YYY {
    weak var delegate: XXX?
}

同时 Protocol 也可以支持 Optional call 了

@objc protocol XXX: NSObjectProtocol {
    
    optional
    func hello()
    
}

class XXXObject: NSObject, XXX {
    
    func hello() { }
    
}

class YYY {
    
    weak var delegate: XXX?
    
    func call() {
        if let helloFunc = delegate?.hello {
            helloFunc()
        }
    }
    
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,246评论 4 61
  • 某企业闭关5年,由核心员工组成天使团队,潜心研修怎样为大众提供健康刚需的产品和服务…… 终于在这一天实现了“以大众...
    田洁阅读 170评论 0 0
  • 后记看着自己小说边抓错字时,被家人呼叫去洗澡了..恩..。 就这样洗着洗着突然灵感来了ww 老样子注重年中组~不过...
    雙水晶_桜庭唯阅读 5,969评论 0 6
  • input.html InputServlet.java 修改web.xml,添加下面的代码
    kylelin阅读 262评论 0 1
  • 你来了, 花开到深深的深红, 绿萍遮住池塘上一层晚梦。
    倒立的双子塔阅读 206评论 0 0