微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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)
    }
}

问题在最后一行:

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

编译器说“不能表达元组转换(Status:Int,Error:String)to(Int?String?)”

我明白问题是self.status和self.message是可选的,parseResponse不返回可选(我不想它).我如何告诉它做必要的分配和转换,以获取数据到实例变量?

解决方法

一个答案建议(改变之前)只做:
(self.status!,self.message!) = self.parseResponse(resultBody)

我发现这是不安全的.如果任务中的self.status或self.message为零,则会崩溃.在游乐场尝试这个测试:

class Test {
    var status: Int?
    var error: String?

    func parseResponse() -> (Status:Int,"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发现,它的工作没有可选:

let (stat,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,"hello")

相当于:

i = 3
s = "hello"

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

原文地址:https://www.jb51.cc/iOS/329687.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐