我正在尝试在 Swift 中创建一个可用于对象构造的协议。我遇到的问题是我需要存储类型信息,以便以后可以构造类型并在回调中返回。我似乎找不到一种方法来存储它而不会导致编译器崩溃或产生构建错误。这是基础知识(一个人为但有效的示例):
protocol Model {
init(values: [String])
func printValues()
}
struct Request<T:Model> {
let returnType:T.Type
let callback:T -> ()
}
我们有一个简单的协议,它声明了一个init
(用于构造)和另一个 func 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
工作正常。但它不存储类型信息,所以它对我来说不是那么有用。我放在那里进行演示。
我发现如果我从 Request struct: 中删除协议要求,我可以防止编译器崩溃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
}
有谁知道我如何将类型信息存储在特定协议中,以便以后可以动态构造并在回调中返回?