swift基础——可选项

2022-03-14  本文已影响0人  夜凉听风雨
var name:String
print(name) // 报错

必须要赋值

var name:String = " "
print(name) // 正确的
var name:String?
print(name) // nil
let arr = [1,2,3]

func searchNumber(index: Int) -> Int? {
    if index < 0 || index >= arr.count {
        return nil
    } else {
        return arr[index]
    }
}

print(searchNumber(index: 1)) // Optional(2)
print(searchNumber(index: -1)) // nil
print(searchNumber(index: 4)) // nil

强制解包

let num = Int("ab123") // 这种方式生成的Int型是可选型 

if num == nil {
    print("转换失败")
} else {
    print("转换结果为\(num!)")
}
var num: Int? = 123

if let temp = num {
    // temp为临时的解包后的值
    print("值为\(temp)")
} else {
    print("值为空")
}
if let num1 = Int("5") { 
    if let num2 = Int("1") {
        if num1 > num2 {
            print("\(num1) > \(num2)")
        }
    }
}

等价于

if let num1 = Int("5"),
    let num2 = Int("1"),
        num1 > num2 {
            print("\(num1) > \(num2)")
}
let arr = ["10", "20", "-30", "40"]
var index = 0
while let num = Int(arr[index]), num > 0 {
    index += 1
    print(num)
}

空合并运算符??

方法定义.png
var a : Int? = 10
var b = Int("20")
print(a ?? b)  // Optional(10)

var a : Int? = nil
var b = Int("20")
print(a ?? b)  // Optional(20)

var a : Int? = 10
var b = 20
print(a ?? b)  // 10

var a : Int? = nil
var b : Int? = nil
print(a ?? b)  // nil

// 多个??一起使用
var a : Int? = nil
var b : Int? = nil
print(a ?? b ?? 3)  // 3
let a: Int? = nil
let b: Int? = 2
if let c = a ?? b {
    print(c) // 2
} // 类似于if a != nil || b != nil

guard语句

// 语法
guard 条件 else {
    // do something...
    退出当前作用域
   // return、break、continue、throw error
}
let info = ["username":"jonas", "password":"12345"]

func login(info: [String : String]) {
    guard let username = info["username"] else {
        print("请输入用户名")
        return
    }
    
    guard let password = info["password"] else {
        print("请输入密码")
        return
    }
    print("用户名=\(username)密码=\(password)")
}

login(info: info)

隐式解包

var num1: Int! = 10 // Optional(10)
var num2: Int = num1 // 10
var num3 = num1 // Optional(10)
var num4 = num1 + 5 // 15

字符串插值

可选项在字符串插值或者直接打印时,编译器会发出警告

var age: Int? = 10
print("age=\(age)") // age=Optional(10)

至少有3种方法消除警告

var age: Int? = 10 
print("age=\(age!)") // age=10 
print("age=\(age! ?? 0)") // age=10
print("age=\(String(describing: age))") // age=Optional(10)

多重可选项

var num1: Int? = 10 // Optional(10)
var num2: Int?? = num1 // Optional(Optional(10))
var num3: Int?? = 10 // Optional(Optional(10))
print(num2 == num3) // true

num1是一个Int型可选项,num2是一个Int型可选项的可选项,num3也是一个Int型可选项的可选项。
多重可选项在直接赋值一个值的时候,会直接包装为多重可选项。

数据包装结构.png
var num1: Int? = nil // nil
var num2: Int?? = num1 // Optional(nil)
var num3: Int?? = nil // nil

print(num1 == num3) // false
print(num2 == num3) // false

(num2 ?? 1) ?? 2 // num2是Optional(nil)不为空所以(num2 ?? 1)是num2!也就是nil,所以(nil ?? 2)结果为2
(num3 ?? 1) ?? 2 // num3是nil,所以 (num3 ?? 1) 结果是1

如果多重可选项直接设置为nil的情况下,不会重复包装。

image.png
上一篇 下一篇

猜你喜欢

热点阅读