ios - 带有 "where"的协议(protocol)导致崩溃

标签 ios swift protocols

<分区>

我想使用 Protocol 来隐藏 UIViewController 的子类类型。所以我创建了一个如下所示的 Protocol:

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

和具体类:

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 的子类符合它。

这是 demo重现它。

swift 版本:4.2

最佳答案

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

例如:

private var displayable: (UIViewController & Displayable)!

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

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

关于ios - 带有 "where"的协议(protocol)导致崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54881109/

相关文章:

ios - 在没有动画的情况下隐藏 viewDidLoad 中的后退按钮

ios - GeocodeAddressAsync在某些地址而非全部地址上引发NSErrorException

ios - 访问扩展中项目中存在的图像

ios - 每个约束项都必须是 View 或布局指南

objective-c - 在 Swift 中实现 Objective c 协议(protocol)

objective-c - Objective C 协议(protocol)的使用

protocols - Elixir 中的 "for"中的 "defimpl"实际上检查了什么?

ios - XLPagerTabStrip - 如何在选择更改时更改所选栏的颜色

javascript - swift/WebKit : Updating HTML in WKWebView with Javascript

swift - 检查用户是否已经注册