2020-11-10可选型

//可选型,可选可能包含一个 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?() 来创建失败构造器。

你可能感兴趣的:(2020-11-10可选型)