Ori*_*rds 42
这些类比并非"完全"正确,但正如我所理解的那样,这是它的要点
是的,协议实际上就像接口一样
类是类,如Java/Android,几乎任何其他语言
结构类似于类,但是当它们从一个变量/函数传递给另一个变量/函数时,它们通过值(复制)传递.如果你完全熟悉C#,它的结构实现非常相似.
例如:
class Foo {
...
}
let x = Foo()
let z = x
Run Code Online (Sandbox Code Playgroud)
此时x和z都引用内存中的相同Object,只有一个Foo对象
struct Bar {
...
}
let a = Bar()
let b = a
Run Code Online (Sandbox Code Playgroud)
分配b时,复制a(想想基本上复制内存块).此时,内存中有两个独立的Bar对象,修改一个不影响另一个.
为什么这有用?有时您不想要共享引用,但主要是出于性能原因.因为结构不必全部引用同一个对象,所以它们不必在堆上分配.它们通常可以在堆栈上分配,这要快得多.结构数组也可以实现为一个大的连续内存块,这意味着如果你想迭代它,它在CPU缓存上更友好.
Swift不是垃圾收集,但对于像C#这样的垃圾收集语言,这可能意味着垃圾收集器不必处理它可能不得不处理的大量对象.即使在swift中,结构复制意味着它可以避免对ARC进行必要的Retain/ Release幕后操作,这可以提供很多帮助.
结构的主要用例是当你有很多不可变的"简单数据",如Vector(一组3个浮点值)