"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
使您的类型成为 UIViewController
和 Displayable
的组合。
例如:
private var displayable: (UIViewController & Displayable)!
这里是 link 一些包含复合类型相关信息的文档:
https://docs.swift.org/swift-book/ReferenceManual/Types.html
我想使用 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
使您的类型成为 UIViewController
和 Displayable
的组合。
例如:
private var displayable: (UIViewController & Displayable)!
这里是 link 一些包含复合类型相关信息的文档:
https://docs.swift.org/swift-book/ReferenceManual/Types.html