1. case let where if 等一些关键字之间的语法糖
import UIKit
let age = 19
// 判断age在0~19之间,并且还要大于18
if case 0 ..< 20 = age, age > 18{ // if case表示用逗号表示同时满足
print("aaa")
}
// 解包,x为第一项的值,并且x还要在2~5之间
let vector = (4, 0)
if case (let x, 0) = vector, x >= 2 && x <= 5 {
print("bbb")
}
// 输出1~10之间能被三整除的数
for case let i in 1...100 where i % 3 == 0 { // 这里不能用逗号替代where
print(i)
}
2. if let的使用
import UIKit
var error: Int? = 404
var errorMessage: String? = "Not found"
// 在if let中,前两个let是解包,后面一个逗号是where判断
if let error = error, let errorMessage = errorMessage, error == 404 {
print("aaa")
print(error)
print(errorMessage)
}
3. 可选链和nil coalesce
import UIKit
var error: Int? = 404
var errorMessage: String? = "Not found"
errorMessage?.uppercased() // 这叫可选链,避免了我一层一层解包
if let errorMessage = errorMessage?.uppercased() { // errorMessage?.uppercased()返回的还是一个可选型,因此仍然可以用if let解包
print(errorMessage)
}
// nil coalesce
let message: String
let message3 = errorMessage ?? "No error" // 如果errorMessage有值,就用,不然就返回一个默认值
4. 隐式可选型
import UIKit
var errorMessage: String! = nil // 隐式的可选型
errorMessage = "not found"
let newString = "The message is " + errorMessage // 这里的errorMessage不用打!号,因为他是隐式可选型,直接使用
print(newString)
import UIKit
class City {
let cityName: String
unowned var country: Country
init(cityName: String, country: Country) {
self.cityName = cityName
self.country = country
}
}
class Country {
let countryName: String
var capitalCity: City! //隐式可选型,这里是可以为nil的,如果不加感叹号,那么在下面的构造函数中就一定要完全传入有值的参数,而传入的是self,就进入了死循环,所以要加上!表示只要countryName有值self就可以有值了,就不会报错了
init(countryName: String, capitalCityName: String) { // 构造函数穿进去两个参数都是字符串
self.countryName = countryName
self.capitalCity = City(cityName: capitalCityName, country: self) // 首都的构造函数,country传入的是自己
}
func showInfo() {
print("This is \(countryName).")
print("The capital is \(capitalCity.country).")
}
}
let china = Country(countryName: "China", capitalCityName: "Beijing")
china.showInfo()