使用协议初始值设定项初始化类类型

时间:2018-06-17 19:34:10

标签: swift generics

这是我的代码:

import UIKit

public protocol Initializer {
    init(id: String)
}

public class A: UIView, Initializer {
    public required init(id: String) {
        super.init(frame: CGRect.zero)
    }

    public required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

class C {
    public static func someFunc<T>(myClass: T.Type) -> T where T: Initializer {
        return myClass.init(id: "test")
    }
}

let myType: UIView.Type = A.self
let myType2: Initializer.Type = A.self

let myView = C.someFunc(myClass: myType)
let myView2 = C.someFunc(myClass: myType2)

let myView3 = C.someFunc(myClass: myType as! Initializer.Type)
let myView4 = C.someFunc(myClass: myType2 as! UIView.Type)

我在尝试调用C.someFunc函数时遇到错误。这就是我想要和期望的:

我得到一个符合Initializer协议的类类型数组,并且从UIView开始。然后我想调用someFunc方法为我调用初始化程序并为我动态选择类,并返回一个UIView。我是否可以对编译器说些什么:&#39;这是一个来自UIView并符合协议Initializable&#39;?

的类的类

编辑:

当我投出很多时,对函数someFunc的一些调用有效:

class C {
    public static func someFunc<T>(myClass: T.Type) -> T where T: UIView {
        return (myClass as! Initializer.Type).init(id: "test") as! T
    }
}

但是,是否存在类型约束可用的编译错误检查程序?

编辑2:

最奇怪的是,这不起作用:

class C {
    public static func someFunc<T>(myClass: T.Type) -> T where T: Initializer, T: UIView {
        return myClass.init(id: "test") // error
    }
}

错误:

  

参数标签&#39;(id:)&#39;不匹配任何可用的重载

为什么会出现此错误?类型T必须符合协议Initializable,这意味着它应该有一个带有签名id:String的公共初始化器。

0 个答案:

没有答案