2014-09-23 80 views
18

我开始学习Swift语言,并且无法绕着Protocols,Structs和Classes进行包装。Swift:协议与结构与类对比

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

这些都是正确的用例是什么?

回答

36

这些类比是不是“准确”是正确的,但是这是它的要点按我的理解

  1. 是的,协议是有效的接口等

  2. 类是类,就像在Java中/ Android,以及几乎任何其他语言

  3. 结构与类相似,但是当它们从一个变量/函数传递给另一个时,它们通过值(复制)传递。 如果你对C#完全熟悉,它的结构实现非常相似。

例如:

class Foo { 
    ... 
} 

let x = Foo() 
let z = x 

此时x和z均是指在存储器中的相同对象,仅存在一个Foo对象

struct Bar { 
    ... 
} 

let a = Bar() 
let b = a 

在分配B,A是复制(考虑基本上复制内存块)。此时,内存中有两个独立的Bar对象,修改其中一个不会影响另一个对象。

为什么这很有用?有时你不需要共享引用,但主要是出于性能原因。因为结构体不必全部引用同一个对象,所以它们不必在堆上分配。他们可以经常在堆栈上分配,这是更快的太多。也可以将结构数组实现为一个大的连续内存块,这意味着如果您想遍历所有内容,则它在CPU高速缓存上更友好。

Swift不是垃圾收集,但对于像C#这样的垃圾收集语言来说,这可能意味着垃圾收集器不必处理很多可能需要的对象。即使在快速的结构复制意味着它可以避免在ARC的幕后需要做,这可以帮助很多。

的主要用途的情况下对于结构是,当你有许多不可变的“简单的数据”的像载体(组3个浮点值)

+0

很好说明。这回答我的问题,谢谢! – 2014-09-23 23:47:43

+0

请注意,数组,字符串和字典都是Swift中的结构。标准库通常倾向于结构和协议而不是类。 – 2014-09-24 09:52:32

+0

“let a = Bar()let b = a。分配b时,复制a(考虑基本上复制内存块)。此时,内存中有两个独立的Bar对象,修改一个不会影响其他。”在实施中不正确。但有效的使用是真实的。当一个结构发生赋值时,会对原始数据进行引用。当你真正改变b时,你只会得到一份副本。这被称为复制写入。它可以节省内存,直到在运行期间实际需要它为止。 – kent 2016-05-10 20:59:21