从关闭中返回一个元组

时间:2014-07-28 10:26:28

标签: 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

        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中的闭包语法,所以我不完全确定我是否做得对。我已将闭包定义为常量。这样我可以从另一个类调用这个闭包吗?如果没有,我怎么能这样做呢?

有人可以帮我解决这些问题吗?

谢谢。

2 个答案:

答案 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>