You use optionals in situations where a value may be absent. An optional represents two possibilities: Either there is a value, and you can unwrap the optional to access that value, or there isn’t a value at all.
enumSeason : Int{ case spring = 1, summer, autumn, winter } iflet season = Season(rawValue: 6) { switch season { case .spring: print("season is spring") default: print("season is other") } } else { print("no such season") } //控制台打印结果: //no such season
示例3:多条件组合判断
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
// 一般写法 iflet first = Int("4") { iflet second = Int("42") { if first < second && second < 100 { print("\(first) < \(second) < 100") } } } //控制台打印结果: //4 < 42 < 100
// 使用组合条件判断的等价写法: iflet first = Int("4"), let second = Int("42"), first < second && second < 100 { print("\(first) < \(second) < 100") } //控制台打印结果: //4 < 42 < 100
示例4:while循环中使用可选项绑定
1 2 3 4 5 6 7 8 9 10 11 12
// 遍历数组,将遇到的正数都加起来,如果遇到负数或非数字,停止遍历 var strs = ["10", "20", "abc", "-20", "30"]
var index = 0; var sum = 0 whilelet num = Int(strs[index]), num > 0 { sum += num index += 1 } print(sum) //控制台打印结果: //30
空合并运算符 ?? (Nil-Coalescing Operator)
定义如下: public func ?? <T>(optional: T?, defaultValue: @autoclosure () throws -> T) rethrows -> T public func ?? <T>(optional: T?, defaultValue: @autoclosure () throws -> T?) rethrows -> T?
(lldb) fr v -R num1 (Swift.Optional<Swift.Int>) num1 = some { some = { _value = 10 } } (lldb) fr v -R num2 (Swift.Optional<Swift.Optional<Swift.Int>>) num2 = some { some = some { some = { _value = 10 } } } (lldb) fr v -R num3 (Swift.Optional<Swift.Optional<Swift.Int>>) num3 = some { some = some { some = { _value = 10 } } } (lldb)