2016-08-01 226 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

相關問題