gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 00:57:10 34 4
gpt4 key购买 nike

我有以下代码:

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()
^~~~ ~~~~

但是我怎样才能定义一个约束来保证类型有一个初始化呢?

最佳答案

可以构造一个自定义协议(protocol)来为 init() 方法绘制蓝图,并将此协议(protocol)用作您的 createInstance< 中通用类型持有者的类型约束功能。例如:

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 的类型的实例。例如:

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()

关于Swift - 如何定义保证类型具有 init 的类型约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43878118/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com