是否可以在Swift 3中编写初始化程序,以便将T
约束为所创建对象的类型? (它定义的类的子类)
的影响
// Not real code
extension UIView {
convenience init<T>(style: (T) -> Void...) where T == self.dynamicType {
self.init()
for s in style {
s(self)
}
}
}
...
let v1 = UIView(style: funcThatAppliesToUIView)
let v2 = UILabel(style: funcThatAppliesToUIView, funcThatAppliesToUILabel)
答案 0 :(得分:0)
您不能在通用约束中使用self
,但是您可以使用Self
来限制扩展类/协议中定义的类型,但是使用它,因为它解析为静态键入你不是动态扩展。(但让它保持ontopic)。即使可能限制动态类型,你也无法做到这一点:
let v2 = UILabel(style: funcThatAppliesToUIView, funcThatAppliesToUILabel)
这是因为T
依赖于它的params,它将被推导到UIView
或UILabel
,但对动态类型(UILabel
)的约束将会仅强制接收UILabel
和funcThatAppliesToUIView
不接受的函数。