我使用协议调用一个func,然后我崩溃了。我知道如何解决这个问题,但我想确切地知道,为什么它不能工作,以及为什么它可以工作。我认为问题可能是方法路径问题。
protocol Testable where Self : UIView{
func update()
}
class JKD : UIView,Testable{
func update() {
print("JKD")
}
}
func test(a : Testable){
a.update()
}
let j2 : JKD = JKD.init(frame: CGRect.zero)
test(a: j2) // it will crash
而这次崩溃有很多方法可以修复,像这样:
@objc protocol Testable where Self : UIView{
func update()
}
或这个:
protocol Testable{
func update()
}
如果func使用通用,它也可以修复崩溃
func test<T : Testable>(a : T) {
a.update()
}
或者,如果扩展中的类继承了协议,它也可以修复崩溃。
class JKD : UIView{}
extension JKD : Testable{
func update() {
print("JKD")
}
}
所以,在这种情况下我想知道,为什么只有第一种方式会崩溃。
来自 Swift 5 发行说明,
协议现在可以将其符合性类型限制为符合子类 给定类。支持两种等效形式:
protocol MyView: UIView { /*...*/ } protocol MyView where Self: UIView { /*...*/ }
Swift 4.2 接受了第二种形式,但它没有完全实现。并且有时会在编译时或运行时崩溃。(SR-5581((38077232(
似乎他们已经修复了 Swift 5 中的现有问题。它在Xcode 10.2 beta 4上运行良好。