//可选型,可选可能包含一个 int 或者 nil。
var age: Int? = nil
age = 38
//可选型解包
var name: String? = nil
name = "ben"
//name.count是不安全的,必须先检查可选型里面有些什么
//解包可选型的一种常见做法是采用 if let 语法,输出 3 letters
if let unwrapped = name {
print("\(unwrapped.count) letters")
} else {
print("Missng name.")
}
//用 guard 解包可选型
//if let 和 guard let 的主要区别在于 guard let 之后可选型还可以继续使用
func greet(_ name: String?){
guard let unwrapped = name else {
print("你没有输入名字!")
return
}
print("您好,\(unwrapped)!")
}
greet(nil)
greet("benbenlang")
//强制解包
let str = "5"
let num = Int(str)!
//空合运算符
func username(for id: Int) -> String?{
if id == 1 {
return "张学友!"
} else {
return nil
}
}
//它将检查 username() 函数返回的值:如果是一个字符串,它将被解包并放入 user,如果是 nil,则使用 “周杰伦” 替代。
let user = username(for: 15) ?? "周杰伦"
//可选链
let names = ["y张学友","z周润发","周星驰"]
let tianwang = names.first?.uppercased()
//可选型
enum PasswordError: Error{
case obvious
}
func checkPassword(_ password: String) throws -> Bool {
if password == "password" {
throw PasswordError.obvious
}
return true
}
do {
try checkPassword("password")
print("这个密码可用!")
} catch {
print("这个密码不可以用!")
}
if let result = try? checkPassword("password"){
print("Result was \(result)")
} else {
print("doooo")
}
try! checkPassword("benben")
print("ok!")
//失败构造器 init?
struct Person {
var id: String
init?(id: String) {
if id.count == 9 {
self.id = id
} else {
return nil
}
}
}
//类型转换 as
class Animal {}
class Fish: Animal{}
class Dog: Animal{
func makeNoise(){
print("汪汪汪!")
}
}
let pets = [Fish(), Dog(), Fish(), Dog()]
//Swift 知道 Fish 和 Dog 都继承自 Animal 类,因此它通过类型推断将 pets 创建为一个 Animal 类型的数组
//这里用到了一个关键字 as?,它将返回一个可选型:类型转换失败时返回 nil,成功则返回转换后的类型
for pet in pets {
if let dog = pet as? Dog {
dog.makeNoise()
}
}
- 可选型让我们可以用一种清晰无歧义的方式表示值缺失的情况。
- Swift不允许不经解包就使用可选型,解包可以用 if let 或者 guard let。
- 你可以用感叹号强制解包可选型,不过如果解出来的是 nil ,你的代码将会崩溃。
- 隐式解包可选型没有做常规可选型的安全性检查。
- 你可以使用空合运算符解包一个可选型,以便可选型里没有值时提供一个默认值。
- 可选链用于操作可选型,如果可选型的值是空的,后续代码将被忽略。
- 你可以使用 try? 将一个可能抛出错误的函数转换成一个可选型的返回值,或者使用 try! 在抛出错误时崩溃。
- 如果你需要在输入不合理时让构造过程失败,可以使用 init?() 来创建失败构造器。
网友评论