我有以下代码:
struct MyStruct {
var v: Int = 1
}
func createInstance<T: Any>(type: T.Type) -> T
{
return type.init()
}
let myType = MyStruct.self
let instance = createInstance(type: myType)
这不起作用,因为我不保证,T有一个init。
Playground execution failed: error: MyPlayground.playground:76:12: error: type 'T' has no member 'init'
return type.init()
^~~~ ~~~~
但是如何定义一个约束来保证类型有一个init?
答案 0 :(得分:3)
您可以构建一个自定义协议,该协议可以为init()
方法设置蓝图,并将此协议用作createInstance
函数中泛型类型的类型约束。 E.g:
protocol SimplyInitializable {
init()
}
struct MyStruct: SimplyInitializable {
var v: Int = 1
}
func createInstance<T: SimplyInitializable>(type: T.Type) -> T
{
return type.init()
}
let myType = MyStruct.self
let instance = createInstance(type: myType)
符合上述SimplyInitializable
的(明确)类型将能够使用createInstance
方法(请注意MyStruct
与SimplyInitializable
的一致性)。
作为上述方法的替代方法,如果您愿意,也可以使用通用struct
而不是全局通用createInstance
方法来创建类型的实例符合SimplyInitializable
。 E.g:
protocol SimplyInitializable {
init()
}
struct SimpleFactory<T: SimplyInitializable> {
static func createInstance() -> T {
return T.init()
}
}
struct MyStruct: SimplyInitializable {
var v: Int = 1
}
let instance = SimpleFactory<MyStruct>.createInstance()