我们有以下代码:
protocol ItemView {
var image: UIImage? { get set }
}
class BaseController<T: UIView where T: ItemView>: UIViewController {
var itemView = T()
}
class ConcreteItemController: BaseController<UIImageView> {
}
对于BaseController我收到一条错误消息,说“Type”UIImageView“不符合协议”ItemView“”。
但为什么?
当我这样做时会显示相同的错误消息:
typealias ConcreteItemController = BaseController<UIImageView>
我真的在这里遗漏了一些东西......为什么UIImageView不符合ItemView协议?它有一个可选的图像属性..那么问题出在哪里?
答案 0 :(得分:3)
UIImageView
未声明它符合ItemView
。因为swift是一种严格类型的语言,它并不能推断出对协议的一致性,因为某些类型只会偶然符合。然而,你可以这样说:
protocol ItemView {
var image: UIImage? { get set }
}
class BaseController<T: UIView where T: ItemView>: UIViewController {
var itemView = T()
}
extension UIImageView: ItemView {}
class ConcreteItemController: BaseController<UIImageView> {
}