调用协议方法会导致崩溃



我使用协议调用一个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上运行良好。

最新更新