我正在尝试将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
的首次声明,您可以明确指定要Int
的ageInt
类型,并且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
值。在您的情况下,ageString
是27
,但是如果ageString
是adsfds
怎么办?
所以在这种情况下,输出将是 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