这是我的代码:
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的公共初始化器。