我正在尝试创建一个类来从Swift中的Web API检索JSON。我没有和代表一起去过,而是考虑过使用闭包,但是我还在努力解决一些事情。
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中的闭包语法,所以我不完全确定我是否做得对。我已将闭包定义为常量。这样我可以从另一个类调用这个闭包吗?如果没有,我怎么能这样做呢?
有人可以帮我解决这些问题吗?
谢谢。
答案 0 :(得分:3)
首先,为了返回nil,你需要让你的闭包返回一个可选的元组。使用(Int, String)?
或(Int, String)!
代替(Int, String)
你得到错误“元组类型”(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
}
答案 1 :(得分:1)
关于第一个错误,您似乎应该将values
元素转换为正确的类型:
return (values[0] as Int, values[1] as String)
关于第二个错误,非可选类型在Swift中不能是nil
,如果要表示缺少值,则应将闭包的返回类型更改为(Int, String)?
。< / p>