Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/97.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 调用协议方法会导致崩溃_Ios_Swift4 - Fatal编程技术网

Ios 调用协议方法会导致崩溃

Ios 调用协议方法会导致崩溃,ios,swift4,Ios,Swift4,我使用协议调用func,然后发生崩溃。我知道如何解决这个问题,但我想确切地知道,为什么它不能工作,为什么它可以工作。我认为问题可能是方法问题 protocol Testable where Self : UIView{ func update() } class JKD : UIView,Testable{ func update() { print("JKD") } } func test(a : Testable){ a.update()

我使用协议调用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()
}
所以,在这种情况下,我想知道为什么只有第一条路会崩溃。

来自Swift 5版本

协议现在可以将其一致性类型约束为 为给定类创建子类。支持两种等效形式:

protocol MyView: UIView { /*...*/ }
protocol MyView where Self: UIView { /*...*/ } 
Swift 4.2接受了第二种形式,但并未完全实施 有时可能在编译时或运行时崩溃。() (38077232)

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

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