swift编译错误:来自' String的Downcast!!'到' String'只打开选项;你的意思是使用' !!'?

时间:2016-05-20 15:35:23

标签: swift types casting

升级到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
  

来自' String的垂头丧气?!'到' String'只打开选项;你的意思是使用' !!'?

以下是详细错误的屏幕截图: http://imgur.com/Efe1nQf

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

3 个答案:

答案 0 :(得分:4)

错误消息显示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"]!
}

答案 1 :(得分:1)

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

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

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

这是一种代码味道,它有很多铸造。也许该词典应该是[String : String]类型,而不是它现在的类型。

答案 2 :(得分:0)

对我来说,只需删除as! String即可。 所以代替

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

替换为

let strFirstName = result!["first_name"]