我在
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?变量.元组分配失败,因为类型需要匹配.