【问题标题】:Returning a Tuple from a Closure从闭包返回元组
【发布时间】:2014-07-28 10:26:28
【问题描述】:

我正在尝试创建一个类来从 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
)

但我无法返回元组中的值。我得到以下两个错误。我已经在上面的代码 sn-p 中对它们进行了注释。

我仍在为 Swift 中的闭包语法而苦苦挣扎,所以我不完全确定我是否做得对。我已经将闭包定义为一个常量。这样我可以从另一个类调用这个闭包吗?如果没有,我怎样才能做到这一点?

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

谢谢。

【问题讨论】:

    标签: ios swift closures tuples


    【解决方案1】:

    首先,为了返回 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
    }
    

    【讨论】:

    • 感谢您的回复。错误消失了。它在某种程度上有效。第一次返回returnTuple,显然它的值为nil。然后,一旦解析了 JSON 并将值分配给 returnTuple,它就不会返回。知道这是为什么吗?
    • 并非如此。添加一些 println 或断点以查看您的代码可能的去向。确保它到达函数的末尾,而不是在某个地方被赶上
    【解决方案2】:

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

    return (values[0] as Int, values[1] as String)
    

    关于第二个错误,在 Swift 中非可选类型不能是nil,如果你想指示没有值,你应该将你的闭包的返回类型更改为(Int, String)?

    【讨论】:

    • 好的,在返回类型末尾添加? 消除了第二个错误。我转换了值,但仍然存在相同的错误。
    猜你喜欢
    • 2014-10-25
    • 2017-04-17
    • 1970-01-01
    • 1970-01-01
    • 2020-05-08
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 2019-05-23
    相关资源
    最近更新 更多