ios – Swift元组到可选分配

前端之家收集整理的这篇文章主要介绍了ios – Swift元组到可选分配前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在 Swift编写一些代码来学习语言.这是我的基础课:
  1. import Foundation
  2. class BaseCommand:NSOperation
  3. {
  4. var status:Int? = nil
  5. var message:String? = nil
  6.  
  7. func buildRequest() -> NSData?
  8. {
  9. return nil
  10. }
  11.  
  12. func parseResponse(data:NSData?) -> (Status:Int,Error:String)
  13. {
  14. return (200,"Success")
  15. }
  16.  
  17. override func main() {
  18. let requestBody = self.buildRequest()
  19.  
  20. println("Sending body \(requestBody)")
  21. // do network op
  22. var networkResultBody = "test"
  23.  
  24. var resultBody:NSData = networkResultBody.dataUsingEncoding(NSUTF8StringEncoding)!
  25. (self.status,self.message) = self.parseResponse(resultBody)
  26. }
  27. }

问题在最后一行:

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

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

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

解决方法

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

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

  1. class Test {
  2. var status: Int?
  3. var error: String?
  4.  
  5. func parseResponse() -> (Status:Int,"Success")
  6. }
  7.  
  8. func testIt() {
  9. (self.status!,self.error!) = parseResponse()
  10. print(self.status)
  11. print(self.error)
  12. }
  13. }
  14.  
  15. let mytest = Test()
  16. mytest.testIt()

这是另一种可以做的事情:

  1. let (stat,err) = self.parseResponse(resultBody)
  2. (self.status,self.error) = (Optional(stat),Optional(err))

或者,@AndriyGordiychuk发现,它的工作没有可选:

  1. let (stat,self.error) = (stat,err)

好奇的是,它的作用是,但分配的功能的结果没有.

请注意以下实验:

  1. var i: Int?
  2. var s: String?
  3.  
  4. // This works
  5. (i,s) = (3,"hello")
  6.  
  7. // This fails with error: cannot express tuple conversion '(Int,String)' to '(Int?,String?)
  8. let t = (3,"hello")
  9. (i,s) = t

看来,当赋值是分配给元组的元组文字时,Swift需要一个快捷方式,而不是首先构造元组.相反,只是分配单个元素.

所以这:

  1. (i,"hello")

相当于:

  1. i = 3
  2. s = "hello"

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

猜你在找的iOS相关文章