"where" 的协议导致崩溃

Protocol with "where" causes crash

我想使用 Protocol 来隐藏 class 的类型,它是 UIViewController 的子 class。所以我创建了一个 Protocol 看起来像这样的:

protocol Displayable where Self: UIViewController {
    func display()
}

和具体的class:

class DisplayableViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

extension DisplayableViewController: Displayable {
    func display() {
        _ = view
    }
}

一切顺利,直到我在运行时执行display()

class ViewController: UIViewController {

    private var displayable: Displayable!

    override func viewDidLoad() {
        super.viewDidLoad()
        displayable = DisplayableViewController()
        displayable.display()
    }
}

崩溃发生在 _ = view

Thread 1: EXC_BAD_ACCESS (code=1, address=0x0)


删除where Self: UIViewController或使(displayable as? DisplayableViewController).display()解决这个问题,但为什么呢?

我只想让 UIViewController 的子class 符合它。

这里是 demo 重现它。

Swift版本:4.2

使您的类型成为 UIViewControllerDisplayable 的组合。

例如:

private var displayable: (UIViewController & Displayable)!

这里是 link 一些包含复合类型相关信息的文档:

https://docs.swift.org/swift-book/ReferenceManual/Types.html