1、 struct和class的区别
在 Swift 中,类是引用类型,结构体是值类型。值类型在传递和赋值时将进行复制,而引用类型则只会使用引用对象的一个"指向"。所以他们两者之间的区别就是两个类型的区别。举个简单的例子,代码如下:
class Temperature {
var value: Float = 37.0
}
class Person {
var temp: Temperature?
func sick() {
temp?.value = 41.0
}
}
let A = Person()
let B = Person()
let temp = Temperature()
A.temp = temp
B.temp = temp
A.sick()
上面这段代码,由于 Temperature 是 class ,为引用类型,故 A 的 temp 和 B 的 temp指向同一个对象。A 的 temp修改了,B 的 temp 也随之修改。这样 A 和 B 的 temp 的值都被改成了 41.0。如果将 Temperature 改为 struct,为值类型,则 A 的 temp 修改不影响 B 的 temp。
内存中,引用类型诸如类是在堆(heap)上,而值类型诸如结构体是在栈(stack)上进行存储和操作。相比于栈上的操作,堆上的操作更加复杂耗时,所以苹果官方推荐使用结构体,这样可以提高 App 运行的效率。
加分回答:
class 有这几个功能 struct 没有的:
- class 可以继承,这样子类可以使用父类的特性和方法;
- 类型转换可以在 runtime 的时候检查和解释一个实例的类型;
- 可以用 deinit 来释放资源;
- 一个类可以被多次引用。
struct 也有这样几个优势:
- 结构较小,适用于复制操作,相比于一个 class 的实例被多次引用更加安全;
- 无须担心内存 memory leak 或者多线程冲突问题。
2、swift的管理权限
Swift 有五个级别的访问控制权限,从高到底依次为比如 Open, Public, Internal, File-private, Private。
他们遵循的基本原则是:高级别的变量不允许被定义为低级别变量的成员变量。比如一个 private 的 class 中不能含有 public 的 String。反之,低级别的变量却可以定义在高级别的变量中。比如 public 的 class 中可以含有 private 的 Int。
- Open 具备最高的访问权限。其修饰的类和方法可以在任意 Module 中被访问和重写;它是 Swift 3 中新添加的访问权限。
- Public 的权限仅次于 Open。与 Open 唯一的区别在于它修饰的对象可以在任意 Module 中被访问,但不能重写。
- Internal 是默认的权限。它表示只能在当前定义的 Module 中访问和重写,它可以被一个 Module 中的多个文件访问,但不可以被其他的 Module 中被访问。
- File-private 也是 Swift 3 新添加的权限。其被修饰的对象只能在当前文件中被使用。例如它可以被一个文件中的不同 class,extension,struct 共同使用。
- Private 是最低的访问权限。它的对象只能在定义的作用域内及其对应的扩展内使用。离开了这个对象,即使是同一个文件中的对象,也无法访问。
3、协议和extention的区别
- extension允许我们为已有协议增加方法或者增加方法的默认实现。
- swift protocol中显示声明的方法,必须实现,但extension提供了默认实现的方法,实例类型可以不提供显示的具体实现(隐示实现了extension的实现)。
- extension的默认实现可以让方法变为可选,即实例不需要提供最终实现。
- 如果方法没有在protocol中显示的声明,类型推断得到是实例类型将会调用实例的最终实现(如果有,没有则调用extension中的默认实现),而如果类型推断的是协议类型,将会调用extension的默认实现。
4、冷信号与热信号的区别
-
Hot Observable是主动的,尽管你并没有订阅事件,但是它会时刻推送,就像鼠标移动;而Cold Observable是被动的,只有当你订阅的时候,它才会发布消息。
-
Hot Observable可以有多个订阅者,是一对多,集合可以与订阅者共享信息;而Cold Observable只能一对一,当有不同的订阅者,消息是重新完整发送。
网友评论