美文网首页
Swift-Optional&Equatable&访问控制权限

Swift-Optional&Equatable&访问控制权限

作者: 浪的出名 | 来源:发表于2020-12-31 14:46 被阅读0次

    Optional

    • Optional是通过enum实现的一个非常好的代表,这里我们可以通过阅读Optional的源码来看一下:
      image
    • 可以看到Optional本质上是一个枚举,当前枚举接受一个泛型参数,而当前some关联的值是Wrapped,也就是说下面两种写法是一样的
    var age : Int?
    var age : Optional<Int>
    
    • 枚举我们可以通过模式匹配来匹配对应的值
    var age : Int? = 10
    
    switch age {
        case .none :
            print("nil")
        case .some(10) :
            print(10)
        default :
            print("default")
    }
    

    Optional解包

    • 涉及到Optional我们就不得不面对一个问题:解包。因为当前的可选项其实是对我们的值做了包装, 当前不为nil的时候我们就需要从其中拿到我们要的值。

    强制解包

    • 简单粗暴,但是如果值为nil就会崩溃


      image

    if let&guard let

    • 实际开发中解包通常是使用if letguard let,这里我们是通过可选项绑定的方式来判断当前的可选项是否有值,我们看一下写法:
    if let tmp = age {
        print(tmp)
    }else{
        print("nil")
    }
    
    func test() {
        
        guard let guardTmp = age else {return}
        
        print(guardTmp)
    }
    
    test()
    
    • 可以看到guard后面的判断条件为else的时候会执行当前大括号里面的内容,反之执行后面的代码。guard在我们当前这句代码里面作用就是如果当前age为空,我们就退出我们当前函数。
    • 其次,大家来看一个点:我们在使用if let创建的内容当中tmp仅仅只能在当前if分支的大括号内访问到,而我们当前的guard定义的guardTmp在当前大括号外部也是能访问到的。

    Equatable

    • Swift中的类型,可以通过遵循Equatable协议来使用相等运算符==和不等运算符¡=来比较两个值相等还是不相等。Swift标准库中绝大多数的类型都默认实现了Equatable协议。
    var age = 10
    var age1 : Int = 10
    
    var isEqual = age == age1
    print(isEqual)
    // 返回结果为true
    
    • 对于Int来说,系统默认实现了==,对于我们自定义的的类型,我们需要遵循Equatable协议
    • 如果是值类型
    struct XQTeacher : Equatable{
        var age : Int
        var name : String
    }
    
    var t = XQTeacher(age: 18, name: "xq")
    
    var t1 = XQTeacher(age: 19, name: "xq")
    
    var t2 = XQTeacher(age: 18, name: "xq")
    
    print(t == t1)
    print(t == t2)
    // 返回结果为false true 
    
    • 观察下sil代码,看看它是怎么实现的,系统帮我们实现了一个函数


      image
    • 函数的实现,通过取出两个结构体,取出结构体的属性依次比较


      image
    • 如果是引用类型,编译器就会报错,需要我们实现对应的函数==

      image
    • 根据提示完善代码

    class XQTeacher : Equatable{
        static func == (lhs: XQTeacher, rhs: XQTeacher) -> Bool {
            return lhs.age == rhs.age && lhs.name == rhs.name
        }
        
        
        var age : Int
        var name : String
        
        init(age : Int , name :String) {
            self.age = age
            self.name = name
        }
    }
    
    var t = XQTeacher.init(age: 18, name: "xq")
    
    var t1 = XQTeacher.init(age: 19, name: "xq")
    
    print(t == t1)
    
    • 经过上面的学习,可以看到==用来检验值是否相等,也就是equal to;
    • ===是用来检验两个对象是否是同一个实例对象是否是同一个

    访问控制权限

    • Swift当中主要是针对其他源文件和模块对你代码的访问控制,这里我们先来总结一下Swift中的有关访问控制权限的关键字
      • private:访问级别仅在当前定义的作用域内有效
      • filePrivate:此访问限制仅限制在当前定义的源文件中
      • Internal:默认访问级别 允许定义模块中的任意源文件访问,但不能被该模块之外的任意源文件访问
      • public: 开放式访问,使我们能够在其定义模块的任何源文件中使用代码,并且可以从另一个源文件访问源文件。只能在定义的模块中继承和子类的重写
      • Open:最不受限制的访问级别

    相关文章

      网友评论

          本文标题:Swift-Optional&Equatable&访问控制权限

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