Swift:Protocol vs. Struct vs. Class

The*_*mad 21 struct protocols class ios swift

我开始学习Swift语言,并且无法绕过Protocols,Structs和Classes.

我来自Android方面的编程,所以我相信Swift Protocols基本上都是Java接口?

每种方法的适当用例是什么?

Ori*_*rds 42

这些类比并非"完全"正确,但正如我所理解的那样,这是它的要点

  1. 是的,协议实际上就像接口一样

  2. 类是类,如Java/Android,几乎任何其他语言

  3. 结构类似于类,但是当它们从一个变量/函数传递给另一个变量/函数时,它们通过值(复制)传递.如果你完全熟悉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个浮点值)