2020-11-10可选型

2020-11-16  本文已影响0人  脑子
//可选型,可选可能包含一个 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()
    }
}

上一篇 下一篇

猜你喜欢

热点阅读