让我们有以下代码:

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

}

07-27 13:29
查看更多