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

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:最不受限制的访问级别
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容