2016-08-01 121 views
1

让我们下面的一段代码:为什么类型不符合协议?

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控件协议?它有一个可选的图像属性..所以问题在哪里?

+3

'UIImageView'没有声明它符合'ItemView' – beyowulf

+1

噢!我认为没有宣布它就足够符合了....为什么你不把这个作为正确的答案,以便我可以给你10个学分。 –

回答

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> { 

} 
+2

extension UIImageView:ItemView {}做得够用;-) ... –

+0

当然,这太好了 – beyowulf

+1

我不会说“它不够聪明”。它的目的是一个类不符合一个协议的巧合,但只有当它自己说明(当然只有必要的位)。 – gnasher729

相关问题