Swift-Optional&Equatable&访问控制权限
2020-12-31 本文已影响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 let
和guard 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
:最不受限制的访问级别
-