超类上的通用便利init()约束到初始化对象的子类?

时间:2016-09-18 13:38:36

标签: swift swift3

是否可以在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)

1 个答案:

答案 0 :(得分:0)

您不能在通用约束中使用self,但是您可以使用Self来限制扩展类/协议中定义的类型,但是使用它,因为它解析为静态键入你不是动态扩展。(但让它保持ontopic)。即使可能限制动态类型,你也无法做到这一点:

let v2 = UILabel(style: funcThatAppliesToUIView, funcThatAppliesToUILabel)

这是因为T依赖于它的params,它将被推导到UIViewUILabel,但对动态类型(UILabel)的约束将会仅强制接收UILabelfuncThatAppliesToUIView不接受的函数。