Ios 从闭包返回元组
我正在尝试创建一个类来从Swift中的web API检索JSON。我没有和代表一起去,而是想到了使用闭包,但我有几件事要做Ios 从闭包返回元组,ios,swift,closures,tuples,Ios,Swift,Closures,Tuples,我正在尝试创建一个类来从Swift中的web API检索JSON。我没有和代表一起去,而是想到了使用闭包,但我有几件事要做 let login = {(email: String, password: String) -> (Int, String) in let response = { (response: NSHTTPURLResponse!, data: HTTPHandler.Data!, error: NSError!) -> Void in
let login = {(email: String, password: String) -> (Int, String) in
let response = { (response: NSHTTPURLResponse!, data: HTTPHandler.Data!, error: NSError!) -> Void in
var value: String? = response.allHeaderFields[HTTPHeaderFields.token] as AnyObject? as? String
var headerData = value?.dataUsingEncoding(NSASCIIStringEncoding)
var values: NSArray = NSJSONSerialization.JSONObjectWithData(headerData, options: .AllowFragments, error: nil) as NSArray
println(values)
return (values[0], values[1]) // Tuple types '(AnyObject!, AnyObject!)' and '()' have a different number of elements (2 vs. 0)
}
let httpHandler = HTTPHandler.POST(SERVER_URL + POSTendpoints.login, data: ["email": email, "password": password], response: response)
return nil // Type '(Int, String)' does not conform to protocol 'NilLiteralConvertible'
}
这是我写的结束语。它接受两个参数(电子邮件、密码),并应返回一个元组(用户ID、API令牌)。我有一个单独的类,名为HTTPHandler
,它调用服务器,我得到并能够成功解析响应。下面是JSON输出的示例
(
2,
JDJ5JDEwJFZ4ZkR4eXlkYUxiYS93TXUwbjBtbnUzaVhidFZBUVVtMTRJM0J3WFFBemszSVVjZ3RWd05h
)
但是我不能返回元组中的值。我得到以下两个错误。我已经在上面的代码片段中对它们进行了注释
我仍然在努力使用Swift中的闭包语法,所以我不能完全确定我是否做对了。我将闭包定义为一个常数。这样我可以从另一个类中调用这个闭包吗?如果没有,我如何才能做到这一点
有人能帮我解决这些问题吗
谢谢。关于第一个错误,您似乎应该将
值
元素转换为正确的类型:
return (values[0] as Int, values[1] as String)
关于第二个错误,非可选类型在Swift中不能是
nil
,如果您想指示没有值,您应该将闭包的返回类型更改为(Int,String)?
关于第一个错误,您似乎应该将值
元素转换为适当的类型:
return (values[0] as Int, values[1] as String)
关于第二个错误,非可选类型在Swift中不能是
nil
,如果您想指示没有值,您应该将闭包的返回类型更改为(Int,String)?
,首先,为了返回nil,您需要使闭包返回可选元组。使用(Int,String)
或(Int,String)代码>而不是(Int,String)
您将得到错误“Tuple types”(AnyObject!AnyObject!)”和“()”具有不同数量的元素”,因为您试图返回一个(Int,String)元组,而不是闭包返回的Void
我现在无法亲自测试,但它看起来像这样:
let login = {(email: String, password: String) -> (Int, String)? in
var returnTuple: (Int, String)? = nil
let response = { (response: NSHTTPURLResponse!, data: HTTPHandler.Data!, error: NSError!) -> Void in
var value: String? = response.allHeaderFields[HTTPHeaderFields.token] as AnyObject? as? String
var headerData = value?.dataUsingEncoding(NSASCIIStringEncoding)
var values: NSArray = NSJSONSerialization.JSONObjectWithData(headerData, options: .AllowFragments, error: nil) as NSArray
println(values)
returnTuple = (values[0], values[1])
}
let httpHandler = HTTPHandler.POST(SERVER_URL + POSTendpoints.login, data: ["email": email, "password": password], response: response)
return returnTuple
}
首先,为了返回nil,您需要使闭包返回一个可选的元组。使用(Int,String)
或(Int,String)代码>而不是(Int,String)
您将得到错误“Tuple types”(AnyObject!AnyObject!)”和“()”具有不同数量的元素”,因为您试图返回一个(Int,String)元组,而不是闭包返回的Void
我现在无法亲自测试,但它看起来像这样:
let login = {(email: String, password: String) -> (Int, String)? in
var returnTuple: (Int, String)? = nil
let response = { (response: NSHTTPURLResponse!, data: HTTPHandler.Data!, error: NSError!) -> Void in
var value: String? = response.allHeaderFields[HTTPHeaderFields.token] as AnyObject? as? String
var headerData = value?.dataUsingEncoding(NSASCIIStringEncoding)
var values: NSArray = NSJSONSerialization.JSONObjectWithData(headerData, options: .AllowFragments, error: nil) as NSArray
println(values)
returnTuple = (values[0], values[1])
}
let httpHandler = HTTPHandler.POST(SERVER_URL + POSTendpoints.login, data: ["email": email, "password": password], response: response)
return returnTuple
}
好的,在返回类型的末尾添加?
可以消除第二个错误。我铸造了这些值,但仍然存在相同的错误。好的,在返回类型的末尾添加?
消除了第二个错误。我铸造了这些值,但仍然存在相同的错误。感谢您的回复。错误消失了。它在某种程度上起作用。第一次返回returnTuple
,它的值显然是零。然后,一旦解析JSON并将值分配给returnTuple
,它就不会返回。知道为什么吗?不知道。添加一些println或断点以查看代码的去向。确保它已经到了函数的末尾,并且没有被卷入到某个地方。谢谢你的回复。错误消失了。它在某种程度上起作用。第一次返回returnTuple
,它的值显然是零。然后,一旦解析JSON并将值分配给returnTuple
,它就不会返回。知道为什么吗?不知道。添加一些println或断点以查看代码的去向。确保它已经到了函数的末尾,而不是在某个地方