05-可选项

2023-04-05  本文已影响0人  二斤寂寞

可选项(Optional)

var name: String? = "Jack" 
name = nil  
var age: Int? // 默认就是nil 
age = 10
age = nil 
var array = [1, 15, 40, 29] 
func get(_ index: Int) -> Int? {
  if index < 0 || index >= array.count {
    return nil  
  }  
  return array[index] 
} 

print(get(1))  // Optional(15) 
print(get(-1)) // nil 
print(get(4))  // nil 

强制解包 (Forced Unwrapping)

var age: Int? // 默认就是nil 
age = 10
age = nil                                                 
image.png
var age: Int? = 10
let ageInt: Int = age!
ageInt += 10
var age: Int? 
age!

Fatal error: Unexpectedly found nil while unwrapping an Optional value 

判断可选项是否包含值

let number = Int("123") 
if number != nil {
  print("字符串转换整数成功:\(number!)") 
} else {
  print("字符串转换整数失败") 
}  
// 字符串转换整数成功:123

可选项绑定 (Optional Binding)

if let number = Int("123") {
 print("字符串转换整数成功:\(number)") 
 // number是强制解包之后的Int值
 // number作用域仅限于这个大括号  
 } else {
  print("字符串转换整数失败")  
 }  
 // 字符串转换整数成功:123
 enum Season : Int {
   case spring = 1, summer, autumn, winter 
 } 

 if let season = Season(rawValue: 6) {
   switch season {
     case .spring:  
     print("the season is spring")  
     default:  
     print("the season is other") 
   } 
 } else {
   print("no such season")  
 } 
 // no such season 

等价写法

if let first = Int("4") {
  if let second = Int("42") {
    if first < second && second < 100 {
      print("\(first) < \(second) < 100")  
    } 
  }  
}  
// 4 < 42 < 100 

if let first = Int("4"),  
    let second = Int("42"), 
    first < second && second < 100 {
  print("\(second) < \(second) < 100")  
}  
// 4 < 42 < 100 

while循环中使用可选项绑定

// 遍历数组,将遇到的正数都加起来,如果遇到负数或者非数字,停止遍历 
var strs = ["10", "20", "abc", "-20", "30"] 

var index = 0
var sum = 0
while let num = Int(strs[index]), num > 0 {
  sum += num  index += 1
}  
print(sum) 

空合并运算符 (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  
 let a: Int? = 1
 let b: Int? = 2
 let c = a ?? b // c是Int? , Optional(1)  

 // a有值,返回a
 let a: Int? = nil
 let b: Int? = 2
 let c = a ?? b // c是Int? , Optional(2)  

 // a无值,返回b
 let a: Int? = nil
 let b: Int? = nil
 let c = a ?? b // c是Int? , nil 

 // a无值,返回b
 let a: Int? = 1
 let b: Int = 2
 let c = a ?? b // c是Int , 1  

 // a有值,返回a,但是b是int,自动解包
 let a: Int? = nil
 let b: Int = 2
 let c = a ?? b // c是Int , 2  

 // a有值,返回a,b是int,自动解包
 // 如果不使用??运算符 
 let a: Int? = nil 
 let b: Int = 2
 let c: Int 
 if let tmp = a {
   c = tmp  
 } else {
  c=b  
 }  

多个 ?? 一起使用

let a: Int? = 1
let b: Int? = 2
let c = a ?? b ?? 3 // c是Int , 1

let a: Int? = nil
let b: Int? = 2
let c = a ?? b ?? 3 // c是Int , 2

let a: Int? = nil
let b: Int? = nil
let c = a ?? b ?? 3 // c是Int , 3

?? 跟 if let 配合使用

let a: Int? = nil 
let b: Int? = 2
if let c = a ?? b {
  print(c) 
}  
// 类似于if a != nil || b != nil 

if let c = a, let d = b {
  print(c)  
  print(d) 
}  
// 类似于if a != nil && b != nil 

if语句实现登录

func login (_ info: [String : String]) {
    let username: String
    if let tmp = info["username"] {
        username = tmp
    } else {
        print("请输入用户名")
        return
    }

    let password: String
    if let tmp = info["password"] {
        password = tmp
    } else {
        print("请输入密码")
        return
    }

    // if username ....
    // if password ....
    print("用户名:\(username)", "密码:\(password)", "登录ing")
}

login(["username" : "jack", "password" : "123456"] ) 
login(["username" : "jack")     // 请输入密码
login(["password" : "123456"] ) // 请输入用户名

guard语句

 guard 条件 esle {
     // do something....
     退出当前作用域
     // return break continue throw error
 }
func login (_ info: [String : String]) {
    guard let username = info["username"] else {
        print("请输入用户名")
        return
    }

    guard let password = info["password"] else {
        print("请输入密码")
        return
    }

    // if username ....
    // if password ....
    print("用户名:\(username)", "密码:\(password)", "登录ing")
}

隐式解包( Implicitly Unwrapped Optional)

 let num1: Int! = 10
 let num2: Int = num1 
 if num1 != nil {
   print(num1 + 6) // 16 
 } 
 if let num3 = num1 {
   print(num3)  
 } 

 let num1: Int! = nil 
 // Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value 
 let num2: Int = num1 

字符串插值

var age: Int? = 10print("My age is \(age)") 
print("My age is \(age!)")
// My age is 10 

print("My age is \(String(describing: age))") 
// My age is Optional(10) 

print("My age is \(age ?? 0)") 
// My age is 10 

多重可选项

var num1: Int? = 10
var num2: Int?? = num1 
var num3: Int?? = 10 
image.png
// num2和num3是等效的
print(num2 == num3) // true 、
image.png image.png image.png
上一篇 下一篇

猜你喜欢

热点阅读