我开始学习Swift语言,并且无法绕着Protocols,Structs和Classes进行包装。Swift:协议与结构与类对比
我来自Android的编程方面,所以我相信Swift协议基本上都是Java接口?
这些都是正确的用例是什么?
我开始学习Swift语言,并且无法绕着Protocols,Structs和Classes进行包装。Swift:协议与结构与类对比
我来自Android的编程方面,所以我相信Swift协议基本上都是Java接口?
这些都是正确的用例是什么?
这些类比是不是“准确”是正确的,但是这是它的要点按我的理解
是的,协议是有效的接口等
类是类,就像在Java中/ Android,以及几乎任何其他语言
结构与类相似,但是当它们从一个变量/函数传递给另一个时,它们通过值(复制)传递。 如果你对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个浮点值)
很好说明。这回答我的问题,谢谢! – 2014-09-23 23:47:43
请注意,数组,字符串和字典都是Swift中的结构。标准库通常倾向于结构和协议而不是类。 – 2014-09-24 09:52:32
“let a = Bar()let b = a。分配b时,复制a(考虑基本上复制内存块)。此时,内存中有两个独立的Bar对象,修改一个不会影响其他。”在实施中不正确。但有效的使用是真实的。当一个结构发生赋值时,会对原始数据进行引用。当你真正改变b时,你只会得到一份副本。这被称为复制写入。它可以节省内存,直到在运行期间实际需要它为止。 – kent 2016-05-10 20:59:21