gpt4 book ai didi

swift - 转换为指定的通用函数参数

转载 作者:行者123 更新时间:2023-11-28 06:34:31 24 4
gpt4 key购买 nike

假设我有一个执行命令的 Commander 对象。返回类型并不总是相同的,会根据命令而变化。

我希望能够使用一个函数将命令转发给指挥官,测试结果是否属于某种类型(作为参数传递),如果转换成功则调用成功闭包,然后否则失败关闭。

我试过使用类似这样的通用参数:

func postCommand<T>(command: String, expectedResponseType: T, success: T -> Void, failure: (NSError?) -> Void) {
Commander.execute(command, completion: { (response: AnyObject?) in
guard let content = response as? T else {
failure(nil)
return
}
success(content)
})
}

这样称呼

self.postCommand("command", expectedResponseType: [String: AnyObject], success: { (content: [String: AnyObject]) in
print("Success")
}) { (error: NSError?) in
print("Failure")
}

但是我从编译器那里得到一个错误:

Cannot convert value of type '([String : AnyObject]) -> Void' to expected argument type '_ -> Void'

如果我尝试像这样进行转换:

guard let content = response as? expectedResponseType

编译器提示 expectedResponseType 不是类型。

我不知道该怎么做。有可能吗?

最佳答案

问题不在于转换,而在于 expectedResponseType: 参数的类型。

如果你想传递一个类型给一个函数,你需要使用the metatype type作为参数类型。在这种情况下,函数的 expectedResponseType: 参数应该是 T.Type 类型——允许您传入一个类型来定义 T .

func postCommand<T>(_ command: String, expectedResponseType: T.Type, success: (T) -> Void, failure: (NSError?) -> Void) {
// ...
}

您还需要使用后缀 .self 来引用您传递给 expectedResponseType: 参数的任何内容的实际类型:

self.postCommand("command", expectedResponseType: [String: AnyObject].self, success: { content in
print("Success")
}) { error in
print("Failure")
}

虽然你应该注意到 T 的类型可以直接从你传递给函数的成功闭包中推断出来:

func postCommand<T>(_ command: String, success: (T) -> Void, failure: (NSError?) -> Void) {
// ...
}

self.postCommand("command", success: { (content: [String: AnyObject]) in
print("Success")
}) { error in
print("Failure")
}

关于swift - 转换为指定的通用函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39409561/

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