swift ?&&!
//let possibleNumber = "123"
//let convertedNumber = Int(possibleNumber)
//// convertedNumber 被推测为类型 "Int?", 或者类型 "optional Int"
//因为该构造器可能会失败,所以它返回一个可选类型(optional) Int ,而不是一个 Int 。一个可选的 Int 被写 作 Int? 而不是 Int 。问号暗示包含的值是可选类型,也就是说可能包含 Int 值也可能不包含值。(不能包含其 他任何值比如 Bool 值或者 String 值。只能是 Int 或者什么都没有。)
let possibleNumber = "123"
let convertedNumber = Int(possibleNumber)
var serverResponseCode: Int? = 404
serverResponseCode = nil
var surveryAnswer :String?
if convertedNumber != nil{
print("convertedNumber contains Some integer Value")
}
//
//
//当你确定可选类型确实包含值之后,你可以在可选的名字后面加一个感叹号( ! )来获取值。这个惊叹号表 示“我知道这个可选有值,请使用它。”这被称为可选值的强制解析(forced unwrapping)
//注意:
//使用 ! 来获取一个不存在的可选值会导致运行时错误。使用 ! 来强制解析值之前,一定要确定可选包含一个非
//nil 的值。
//使用可选绑定(optional binding)来判断可选类型是否包含值,如果包含就把值赋给一个临时常量或者变 量。可选绑定可以用在 if 和 while 语句中,这条语句不仅可以用来判断可选类型中是否有值,同时可以将可选 类型中的值赋给一个常量或者变量。 if 和 while 语句,请参考控制流。
if let actualNumber = Int(possibleNumber){
print("\'\(possibleNumber)\' has an integer vlaue of \(actualNumber)")
}
if let firstNumber = Int("4"), secondNumber = Int("44") where firstNumber < secondNumber {
print("\(firstNumber) < \(secondNumber)")
}
//如上所述,可选类型暗示了常量或者变量可以“没有值”。可选可以通过 if 语句来判断是否有值,如果有值的话 可以通过可选绑定来解析值。
//有时候在程序架构中,第一次被赋值之后,可以确定一个可选类型总会有值。在这种情况下,每次都要判断和解
//析可选值是非常低效的,因为可以确定它总会有值。
//这种类型的可选状态被定义为隐式解析可选类型(implicitly unwrapped optionals)。把想要用作可选的类型 的后面的问号( String? )改成感叹号( String! )来声明一个隐式解析可选类型。
let possibleString :String? = "An optional String"
let forceString :String = possibleString! // 需要!获取值
let assumString: String! = "An implicitly unwarpped optional String"
let implicitString:String = assumString
//注意:
//如果你在隐式解析可选类型没有值的时候尝试取值,会触发运行时错误。和你在没有值的普通可选类型后面加一
//个惊叹号一样。
if assumString != nil{
print( assumString)
}
if let definiteString = assumString {
print(definiteString)
}