Ios 从闭包返回元组

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

我正在尝试创建一个类来从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中的闭包语法,所以我不能完全确定我是否做对了。我将闭包定义为一个常数。这样我可以从另一个类中调用这个闭包吗?如果没有,我如何才能做到这一点

有人能帮我解决这些问题吗


谢谢。

关于第一个错误,您似乎应该将
元素转换为正确的类型:

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或断点以查看代码的去向。确保它已经到了函数的末尾,而不是在某个地方