我正在用Swift编写一些代码来学习该语言。这是我的基类:

import Foundation
class BaseCommand:NSOperation
{
    var status:Int? = nil
    var message:String? = nil

    func buildRequest() -> NSData?
    {
        return nil
    }

    func parseResponse(data:NSData?) -> (Status:Int, Error:String)
    {
        return (200, "Success")
    }

    override func main() {
        let requestBody = self.buildRequest()

        println("Sending body \(requestBody)")
        // do network op
        var networkResultBody = "test"

        var resultBody:NSData = networkResultBody.dataUsingEncoding(NSUTF8StringEncoding)!
        (self.status, self.message) = self.parseResponse(resultBody)
    }
}

问题在最后一行:
(self.status, self.message) = self.parseResponse(resultBody)

编译器说:“无法将元组转换(Status:Int,Error:String)转换为(Int ?, String?)”

我知道问题在于self.status和self.message是 optional ,而parseResponse不会返回Optionals(并且我不希望这样做)。我如何告诉它进行必要的分配和转换,以将数据转换为实例变量?

最佳答案

建议另一个答案(在更改之前)只是这样做:

(self.status!, self.message!) = self.parseResponse(resultBody)

我发现这是不安全的。如果分配时self.statusself.messagenil,它将崩溃。在Playground中尝试以下测试:
class Test {
    var status: Int?
    var error: String?

    func parseResponse() -> (Status:Int, Error:String)
    {
        return (200, "Success")
    }

    func testIt() {
        (self.status!, self.error!) = parseResponse()
        print(self.status)
        print(self.error)
    }
}

let mytest = Test()
mytest.testIt()

这是可以完成的另一种方法:
let (stat, err) = self.parseResponse(resultBody)
(self.status, self.error) = (Optional(stat), Optional(err))

或者,就像@AndriyGordiychuk发现的那样,它无需Optional即可工作:
let (stat, err) = self.parseResponse(resultBody)
(self.status, self.error) = (stat, err)

奇怪的是,它起作用了,但是分配函数的结果却没有。

请注意以下实验:
var i: Int?
var s: String?

// This works
(i, s) = (3, "hello")

// This fails with error: cannot express tuple conversion '(Int, String)' to '(Int?, String?)
let t = (3, "hello")
(i, s) = t

似乎当分配是分配给元组的元组文字时,Swift会采用快捷方式并且不会首先构造该元组。相反,只是分配各个元素。

所以这:
(i, s) = (3, "hello")

等效于:
i = 3
s = "hello"

之所以有效,是因为您可以将Int分配给Int?变量,并且将String分配给String?变量。元组分配失败,因为类型需要匹配。

关于ios - 快速元组到 optional 分配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32173623/

10-11 01:28
查看更多