为什么当变量类型为 Int 并且 swift 3 中没有 nil 值时我们必须解开包装



我正在尝试将String转换为Int . 在第一种方式中,

let ageString: String = "27"
let ageInt:Int = Int(ageString)!

系统要求使用exclamation (!)标记来unwrapped

但以以下方式,

let ageString: String = "27"
let ageInt = Int(ageString)

没关系,为什么是比。

您尝试使用Int init?(_ text: String)将返回可选的Int?值。

因此,通过let ageInt:Int首次声明,您可以明确指定要IntageInt类型,并且Int? Int(ageString)的结果,以便编译器告诉您通过在末尾添加!来解开可选包。

现在,使用let ageInt的第二次声明,您尚未指定结果的类型,因此其可选Int?和编译器的类型不会提示您建议添加!

现在,如果ageString无效,则第一个声明将崩溃 整数 如下例所示。

let ageString: String =  "27.5" //Float or some string "hello"
let ageInt:Int = Int(ageString)! // This line give you unexpectedly found nil crash

如果 ageString 不是有效的整数,则第二个声明不会发生这种情况。

let ageString: String = "27.5" //Float or some string "hello"
let ageInt = Int(ageString) // Now ageInt is nil but app will not crash as of your not force wrapping the optional.

因为编译器不知道Int(ageString)会产生实际的Int值。在您的情况下,ageString27,但是如果ageStringadsfds怎么办?

所以在这种情况下,输出将是 Nil ,因此通过强制!展开,您是在说输出将被Int

第一个中,您告诉ageInt具有Int类型。 所以它不能有零值。在第二个中,您没有告诉它应该具有哪种类型。所以它会得到 Int?类型,并且可以获取零值。看看这个:

let ageInt:Int = Int(ageString)!
let ageOptionalInt = Int(ageString)
let ageOptionalInt2: Int? = Int(ageString)

使用此扩展名将字符串转换为 Int

extension String {
    var toInt:Int?{
        get{
            return Int(self)
        }
    }

}

let a = "55".toInt

最新更新