【发布时间】:2016-08-16 03:42:39
【问题描述】:
我有这个协议:
protocol ViewType {
associatedtype T: ViewData.View
var data:T! {get set}
}
ViewData.View 是一个类
我有一个名为TemplateLabel 的类继承UILabel 并符合ViewType
class TemplateLabel:UILabel, ViewType {
var data: ViewData.View.Label!
}
我从情节提要中得到这个 TemplateLabel 作为 UIView 并尝试将 UIView 转换为 ViewType 以将 data 属性分配给它
let view = SB.instantiateViewControllerWithIdentifier("view_label").view
if var v = view as? ViewType { // Error
v.data = data // Error
}
但我得到错误:
Protocol 'ViewType' 只能用作通用约束,因为它具有 Self 或关联的类型要求
成员“数据”不能用于协议类型“ViewType”的值;改用通用约束
【问题讨论】:
-
您应该转换为特定的实现,而不是约束协议。投射到
TemplateLabel。并阅读有关 Swift 协议的更多信息 :) -
@werediver 我有一个具体的原因不直接转换为 TemplateLabel,这是为了让事情变得动态,这只是一个简短的例子
-
那么你需要一个通用的方法......我可以展示一个例子(几分钟后)。另一种方法是类型擦除,但我认为这太深了。
-
嗯,我错了。泛型方法无法解决此类问题,因为泛型方法是在编译时为特定类型实例化的,但您的对象类型在编译时是未知的,除非您将其强制转换为特定实现。
-
观看 Rob Napier 的演讲,深入了解这个问题 - thedotpost.com/2016/01/…
标签: ios swift generics protocols