gpt4 book ai didi

Swift:基于协议(protocol)的类型构造

转载 作者:行者123 更新时间:2023-11-30 10:14:36 24 4
gpt4 key购买 nike

我正在尝试在 Swift 中创建一个可用于对象构造的协议(protocol)。我遇到的问题是我需要存储类型信息,以便稍后可以构造该类型并在回调中返回。我似乎无法找到一种方法来存储它而不会使编译器崩溃或创建构建错误。这是基础知识(一个人为的但有效的示例):

protocol Model {
init(values: [String])
func printValues()
}

struct Request<T:Model> {
let returnType:T.Type
let callback:T -> ()
}

我们有一个简单的协议(protocol),声明 init (用于构造)和另一个功能 printValues() (供测试用)。我们还定义了一个结构体,可用于存储类型信息和一个回调,用于在构造新类型时返回该类型。

接下来我们创建一个构造函数:

class Constructor {
var callbacks: [Request<Model>] = []

func construct<T:Model>(type:T.Type, callback: T -> ()) {
callback(type(values: ["value1", "value2"]))
}

func queueRequest<T:Model>(request: Request<T>) {
callbacks.append(request)
}

func next() {
if let request = callbacks.first {
let model = request.returnType(values: ["value1", "value2"])
request.callback(model)
}
}
}

需要注意的几点:这会导致编译器崩溃。由于某种原因它无法弄清楚这一点。问题似乎是 var callbacks: [Request<Model>] = [] 。如果我注释掉其他所有内容,编译器仍然会崩溃。注释掉 var 回调,编译器就会停止崩溃。

此外,func construct工作正常。但它不存储类型信息,因此对我来说没有多大用处。我放在那里是为了演示。

我发现如果我从请求结构中删除协议(protocol)要求,我可以防止编译器崩溃:struct Request<T> 。在这种情况下,一切正常并编译,但我仍然需要注释掉 let model = request.returnType(values: ["value1", "value2"])func next() 。这也会导致编译器崩溃。

这是一个使用示例:

func construct() {
let constructor = Constructor()
let request = Request(returnType: TypeA.self) { req in req.printValues() }

//This works fine
constructor.construct(TypeA.self) { a in
a.printValues()
}

//This is what I want
constructor.queueRequest(request)
constructor.next() //The callback in the request object should be called and the values should print
}

有谁知道如何将仅限于特定协议(protocol)的类型信息存储到以后可以动态构造并在回调中返回的类型?

最佳答案

如果您想要与 next 完全相同的行为,我建议这样做:

class Constructor {
// store closures
var callbacks: [[String] -> ()] = []

func construct<T:Model>(type:T.Type, callback: T -> ()) {
callback(type(values: ["value1", "value2"]))
}

func queueRequest<T:Model>(request: Request<T>) {
// some code from the next function so you don't need to store the generic type itself
// **EDIT** changed closure to type [String] -> () in order to call it with different values
callbacks.append({ values in
let model = request.returnType(values: values)
request.callback(model)
})
}

func next(values: [String]) {
callbacks.first?(values)
}
}

现在您可以使用您的值调用next。希望这对您有用。

编辑:对闭包类型和 next 函数进行了一些更改

关于Swift:基于协议(protocol)的类型构造,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30920200/

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