为什么类型不符合协议?
让我们下面的一段代码:为什么类型不符合协议?
protocol ItemView {
var image: UIImage? { get set }
}
class BaseController<T: UIView where T: ItemView>: UIViewController {
var itemView = T()
}
class ConcreteItemController: BaseController<UIImageView> {
}
对于BaseController我得到一个错误信息说“类型‘的UIImageView’不符合协议‘ItemView控件’”。
但是为什么?
同样的错误信息显示出来当我这样做,而不是:
typealias ConcreteItemController = BaseController<UIImageView>
我真的失去了一些东西在这里...为什么会在UIImageView的不符合ItemView控件协议?它有一个可选的图像属性..所以问题在哪里?
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> {
}
extension UIImageView:ItemView {}做得够用;-) ... –
当然,这太好了 – beyowulf
我不会说“它不够聪明”。它的目的是一个类不符合一个协议的巧合,但只有当它自己说明(当然只有必要的位)。 – gnasher729
'UIImageView'没有声明它符合'ItemView' – beyowulf
噢!我认为没有宣布它就足够符合了....为什么你不把这个作为正确的答案,以便我可以给你10个学分。 –