Swift - 闭包中的泛型
Swift - generics in closure
我来自 .NET 世界,所以我对 Swift 中泛型的实现方式有些困惑。我正在尝试执行以下操作:
func request<T: Model>(resultHandler: (model: T?) -> ()) {
var model: T? = nil
NSURLSession.sharedSession().dataTaskWithURL(NSURL(string: self.url)!) {
data, response, error in
if let json = NSString(data: data, encoding: NSUTF8StringEncoding) {
model = T(json: json)
resultHandler(model: model)
}
}.resume()
}
并按如下方式消费:
var store: HttpStore = HttpStore(url: ...)
store.request {
model in
println("Task name: \(model.name!)")
}
我收到以下错误:
'T?' does not have a member named 'name'
我明白为什么了。我没有在我的调用代码中的任何地方将 T 解析为特定类型。在 .NET 中,我会做类似 store.request< Task >()... 但我不能在 Swift.
中那样做的事情
有什么方法可以完成我在这里想做的事情吗?
闭包表达式的形式通常为
{ (param_1 : type_1, ..., param_n : type_n ) -> return_type in
statements
}
当闭包类型已知或可以从上下文中推断出时,您可以省略参数类型,return 类型(以及参数周围的括号):
{ param_1, ..., param_n in
statements
}
但是在你的代码中
store.request {
model in
// ...
}
闭包的类型无法从上下文中推断出来,你必须写
它明确为
store.request {
(model : Task?) -> () in
// ...
}
或(return 类型 ()
又名 Void
可以省略):
store.request {
(model : Task?) in
// ...
}
请注意,在块内,model
是一个 可选的 。正如 Antonio 在现已删除的答案中所说的那样,
你将不得不打开可选的包装,所以
println("Task name: \(model.name!)")
应该是
println("Task name: \(model!.name)")
如果 model
可能是 nil
那么您可以使用可选绑定来测试它:
if let theModel = model {
println("Task name: \(theModel.name)")
}
我来自 .NET 世界,所以我对 Swift 中泛型的实现方式有些困惑。我正在尝试执行以下操作:
func request<T: Model>(resultHandler: (model: T?) -> ()) {
var model: T? = nil
NSURLSession.sharedSession().dataTaskWithURL(NSURL(string: self.url)!) {
data, response, error in
if let json = NSString(data: data, encoding: NSUTF8StringEncoding) {
model = T(json: json)
resultHandler(model: model)
}
}.resume()
}
并按如下方式消费:
var store: HttpStore = HttpStore(url: ...)
store.request {
model in
println("Task name: \(model.name!)")
}
我收到以下错误:
'T?' does not have a member named 'name'
我明白为什么了。我没有在我的调用代码中的任何地方将 T 解析为特定类型。在 .NET 中,我会做类似 store.request< Task >()... 但我不能在 Swift.
中那样做的事情有什么方法可以完成我在这里想做的事情吗?
闭包表达式的形式通常为
{ (param_1 : type_1, ..., param_n : type_n ) -> return_type in
statements
}
当闭包类型已知或可以从上下文中推断出时,您可以省略参数类型,return 类型(以及参数周围的括号):
{ param_1, ..., param_n in
statements
}
但是在你的代码中
store.request {
model in
// ...
}
闭包的类型无法从上下文中推断出来,你必须写 它明确为
store.request {
(model : Task?) -> () in
// ...
}
或(return 类型 ()
又名 Void
可以省略):
store.request {
(model : Task?) in
// ...
}
请注意,在块内,model
是一个 可选的 。正如 Antonio 在现已删除的答案中所说的那样,
你将不得不打开可选的包装,所以
println("Task name: \(model.name!)")
应该是
println("Task name: \(model!.name)")
如果 model
可能是 nil
那么您可以使用可选绑定来测试它:
if let theModel = model {
println("Task name: \(theModel.name)")
}