Swift - 如何定义保证类型具有init的类型约束

时间:2017-05-09 19:14:42

标签: swift generics

我有以下代码:

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?

1 个答案:

答案 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方法(请注意MyStructSimplyInitializable的一致性)。

作为上述方法的替代方法,如果您愿意,也可以使用通用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()