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:最不受限制的访问级别
-













网友评论