美文网首页
Swift 可选类型

Swift 可选类型

作者: 诗颜语 | 来源:发表于2022-04-20 09:13 被阅读0次

    前言

    尽量不使用

    可选类型(也有叫‘可选项’的),算是Swift的一个特色,可以让程序在编写阶段就发现大部分因为变量为空而导致的问题,提高安全性;(dart的空安全就于此类似,对flutter还不太熟,如果说错,请删除)

    何时使用

    之前说了 变量声明阶段必须有值,但是实际开发中总有特例,总有在声明或初始化阶段无法确定值的情况,这时就需要可选类型;

    如何声明

    在变量声明的基础上添加?问号:

    var 变量名: 类型名? = 值

    eg: var name: String?

    这里注意要用var修饰 用let修饰没有意义,'类型名'不可省略,’值‘可以省略;

    var name: String?
    name = "baidu"
    print(name!) // baidu  如果name = nil 会crash
    print(name ?? "s")// baidu  如果name = nil 则输出s
    print(name as Any)// Optional("baidu") 显然这不是我们想要的  如果name = nil 则输出 nil
    
    
    if let str = name { // name如果有值,会自动解包并赋值给str
        print(str) // baidu
    }else{
        print("name is nil")
    }
    
    
    
    
    var age: Int! = 10 //如果声明时用叹号,将来使用时会隐式解包  非常不建议使用!!!!!
    age = 18
    let age2: Int = age // 隐式解包只会发生在赋值时?
    print(age as Any, age2) // Optional(18) 18  如果age = nil 会crash
    

    怎样理解

    可选类型可以理解为一个特殊类型,只有两种情况: 有值(Optional)、无值(nil) 。

    然而我们想要使用可选类型中的值,则需要解包。

    解包:正好今天换工位,领了一个纸箱,可以把可选类型比作一个纸箱,纸箱中要么是空的,要么有东西。而从有东西的纸箱中取出这个东西的过程成为解包;解包后纸箱就被丢弃,值便裸露出来;

    使用中提到了解包,常用的有三种形式:1. 用叹号!是强制解包,不是在非常确定有值的情况下不要使用;2. 用双问号?? 问号左边的变量自动解包如果有值则返回,如果未nil则返回问号右侧的值;3. 用 if let str = name {} ;

    可选链

    提到可选类型,就得说说可选链:由可选类型的属性构成的调用链条。eg: preson.pet?.name = "Jerry"

      class Dog {
            var name: String? = "Tom"
        }
        class Preson {
            ///宠物
            var pet: Dog? = nil
        }    
    
    
        let preson = Preson()
        preson.pet?.name = "Jerry"
        print(preson.pet?.name as Any) // 输出 nil  这里pet右边的问号必须要加,如果pet=nil则不会调用后边的name,而直接返回nil。反之如果?变!则会crash
        
    
    
        preson.pet = Dog()
        preson.pet?.name = "Jerry"
        print(preson.pet?.name ?? "无") // 输出 Jerry
        print(preson.pet!.name!) // 输出 Jerry 不建议这样写
    
    

    相关文章

      网友评论

          本文标题:Swift 可选类型

          本文链接:https://www.haomeiwen.com/subject/mlvtertx.html