2016-08-01 4 views
1

는 이제 다음 코드 조각을 보자 다음 BaseController를 들어형식이 프로토콜을 준수하지 않는 이유는 무엇입니까?

protocol ItemView { 

    var image: UIImage? { get set } 
} 

class BaseController<T: UIView where T: ItemView>: UIViewController { 

    var itemView = T() 
} 

class ConcreteItemController: BaseController<UIImageView> { 

} 

을 내가 ItemView "" "프로토콜을 준수하지 않는" "유형"의 UIImageView를라는 오류 메시지가 무엇입니까.

하지만 왜? 정말 여기에 뭔가를 놓친 거지

typealias ConcreteItemController = BaseController<UIImageView> 

... 왜있는 UIImageView 프로토콜을 ItemView을 준수하지 않을 : 내가 대신이 작업을 수행 할 때

같은 오류 메시지가 나타납니다? 선택적 이미지 속성이 있습니다. 문제가 어디에 있습니까?

+3

'UIImageView'는'ItemView'에 부합한다고 선언하지 않습니다. – beyowulf

+1

아 맞습니다! 나는 그것을 선언하지 않고도 순응하는 것으로 충분하다고 생각했습니다. 나는 이것을 당신에게 적절한 답으로 써서 10 크레딧을 줄 수는 없지요. –

답변

3

UIImageViewItemView을 따르지 않는다고 선언하지 않습니다. 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

확장 UIImageView : ItemView {}로 충분했습니다 ;-) ... –

+0

오 물론입니다. 훨씬 더 좋네요. – beyowulf

+1

"나는 충분히 똑똑하지 않습니다"라고 말하지 않을 것입니다. 클래스가 우연히 프로토콜에 순응하지 않는다는 것을 목적에두고 있지만, 그렇게 말할 때만 (그리고 물론 필요한 비트만을 가짐). – gnasher729

관련 문제