Swift元组到可选赋值

Dav*_* S. 13 tuples optional ios swift

我正在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)
    }
}
Run Code Online (Sandbox Code Playgroud)

问题出在最后一行:

(self.status, self.message) = self.parseResponse(resultBody)
Run Code Online (Sandbox Code Playgroud)

编译器说"无法将元组转换(状态:Int,错误:字符串)表示为(Int?,String?)"

我知道问题是self.status和self.message是可选项,而parseResponse不返回Optionals(我不想要它).如何告诉它进行必要的分配和转换以将数据导入实例变量?

vac*_*ama 6

另一个答案建议(在改变之前)只做:

(self.status!, self.message!) = self.parseResponse(resultBody)
Run Code Online (Sandbox Code Playgroud)

我发现这是不安全的.如果任它会崩溃self.status或者self.messagenil在转让的时间.在游乐场试试这个测试:

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()
Run Code Online (Sandbox Code Playgroud)

这是另一种方法:

let (stat, err) = self.parseResponse(resultBody)
(self.status, self.error) = (Optional(stat), Optional(err))
Run Code Online (Sandbox Code Playgroud)

或者,正如@AndriyGordiychuk发现的那样,它没有Optional:

let (stat, err) = self.parseResponse(resultBody)
(self.status, self.error) = (stat, err)
Run Code Online (Sandbox Code Playgroud)

奇怪的是,这是有效的,但是分配函数的结果却没有.


请注意以下实验:

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
Run Code Online (Sandbox Code Playgroud)

似乎当赋值是一个赋予元组的元组文字时,Swift采用了一个快捷方式而不是首先构造元组.相反,只是分配各个元素.

所以这:

(i, s) = (3, "hello")
Run Code Online (Sandbox Code Playgroud)

相当于:

i = 3
s = "hello"
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为你可以分配Int一个Int?变量和String一个String?变量.元组分配失败,因为类型需要匹配.