【问题标题】:swift compilation error: Downcast from 'String?!' to 'String' only unwraps optionals; did you mean to use '!!'?快速编译错误:从“字符串?!”向下转换to 'String' 只解开选项;你的意思是使用'!!'?
【发布时间】:2016-05-20 15:35:22
【问题描述】:

升级到 cocoapods 1.0 后,我收到以下代码行的编译错误:

var strName = String()
var strEmail = String()
var strFacebookID = String()
var strPassword = String()
var objHelper = Helper()

....

let strFirstName = result["first_name"] as! String
let strLastName = result["last_name"] as! String
self.strName = strFirstName + "_" + strLastName
self.strEmail = result["email"] as! String
self.strFacebookID = result["id"] as! String

来自“字符串?!”的失望to 'String' 只解开选项;你的意思是使用'!!'?

这里是详细的错误截图: http://imgur.com/Efe1nQf

更新: 更多代码在这里:https://gist.github.com/anonymous/9c91c2eb1ccf269e78a118970468d1e8

【问题讨论】:

  • 结果的类型是什么?
  • @PEEJWEEJ 根据报错信息resultAnyObject?
  • @Axil 将其用作字典,您的意思是 [String : AnyObject] 吗?
  • @PEEJWEEJ 对,但无论如何result 是可选的。

标签: swift types casting


【解决方案1】:

错误消息表明result 本身是可选的,因此您必须分别解开result 和值。

let strFirstName = result!["first_name"] as! String

或更好地使用可选绑定以获得更高的安全性和更少的类型转换

if let userData = result as? [String:String] {
   let strFirstName = userData["first_name"]!
   let strLastName = userData["last_name"]!
}

【讨论】:

  • 我认为可以解决它。有其他错误出来。我不知道你在做什么,因为我试图修复其他人的快速代码。感叹号是干什么用的!什么是?感谢您帮助我的无知。
  • 感叹号解开可选项并在可选项为nil 时导致运行时错误(崩溃)。问号与if-let 一起解开可选项并将值转换为成功时的特定类型,否则跳过if 子句。请阅读 Swift 语言指南中的基础知识。
【解决方案2】:

result["key"] 本身返回一个可选项,因为字典中可能不存在该键。

您需要先解开该可选项,然后将返回的值转换为字符串。试试这个:

let strFirstName = result["first_name"]! as! String

这是一种代码味道,需要大量转换。也许那个字典应该是[String : String] 类型而不是现在的类型。

【讨论】:

    【解决方案3】:

    对我来说,只需删除 as! String 即可。 所以,而不是,

    let strFirstName = result!["first_name"] as! String
    

    替换为,

    let strFirstName = result!["first_name"]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多