调用协议方法会导致崩溃

时间:2019-03-25 05:05:28

标签: ios swift4

我使用协议调用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使用Generic,它也可以修复崩溃问题

func test<T : Testable>(a : T) {
    a.update()
}

或者如果扩展中的类继承协议,它也可以修复崩溃。

class JKD : UIView{}
extension JKD : Testable{
    func update() {
        print("JKD")
    }
}

所以,在这种情况下,我想知道为什么只有第一种方法会崩溃。

1 个答案:

答案 0 :(得分:1)

从Swift 5版本notes

  

协议现在可以将其符合类型限制为   子类化给定的类。支持两种等效形式:

protocol MyView: UIView { /*...*/ }
protocol MyView where Self: UIView { /*...*/ } 
     

Swift 4.2接受了第二种形式,但尚未完全实施   有时可能会在编译时或运行时崩溃。 (SR-5581)   (38077232)

似乎它们已经解决了Swift 5中的现有问题。它在Xcode 10.2 beta 4上运行良好。