首页 热点专区 小学知识 中学知识 出国留学 考研考公
您的当前位置:首页正文

Protocol 与 NSObject 的情与恨

2024-12-09 来源:要发发知识网

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()
        }
    }
    
}
显示全文