Swift:Protocol vs. Struct vs. Class

时间:2014-09-23 21:52:53

标签: ios class struct swift protocols

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

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

每种情况的适当用例是什么?

1 个答案:

答案 0 :(得分:41)

这些类比不是"确切地说"是正确的,但这是我理解的要点

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

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

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

  4. 例如:

    class Foo {
       ...
    }
    
    let x = Foo()
    let z = x 
    

    此时x和z都引用内存中的相同Object,只有一个Foo对象

    struct Bar {
       ...
    }
    
    let a = Bar()
    let b = a 
    

    分配b时,复制a(想想基本上复制内存块)。此时,内存中有两个独立的Bar对象,修改一个对象不会影响另一个。

    为什么这有用?有时您不想要共享引用,但主要是出于性能原因。因为结构不必全部引用相同的对象,所以它们不必在堆上分配。相反,它们通常可以在堆栈上分配,而很多更快。结构数组也可以实现为一个大的连续内存块,这意味着如果你想迭代它,它在CPU缓存上会更友好。

    Swift不是垃圾收集,但对于像C#这样的垃圾收集语言,这可能意味着垃圾收集器不必处理它可能不得不处理的许多对象。即使在swift中,结构复制也意味着它可以避免在ARC后面的Retain / Release进行必要的操作,这可以提供很多帮助。

    结构的主要用例是当你有大量不可变的简单数据时#34;像一个Vector(一组3个浮点值)