美文网首页
swift里面的类型分类

swift里面的类型分类

作者: 陈藩 | 来源:发表于2018-05-15 17:20 被阅读0次

swift里面的类型分为两种:

值类型(Value Types):每个实例都保留了一份独有的数据拷贝,一般以结构体(struct)、枚举(enum)或者元组(tuple)的形式出现。

引用类型(Reference Type):每个实例共享同一份数据来源,一般以类(class)的形式出现。

值类型和引用类型最基本的分别在复制之后的结果。当一个值类型被复制的时候,相当于创造了一个完全独立的实例,这个实例保有属于自己的独有数据,数据不会受到其他实例的数据变化影响:

struct S {var:data:Int = -1}
var a = S()
var b = a 
a.data = 42
print("\(a.data),\(b.data)")    输出结构42,-1

值类型就好像身份证复印件一样,复印出来之后,修改原件上面的内容,复印件上的内容不会变。

另一方面,复制一个引用类型的时候,实际上是默默的创造了一个共享的实例分身,两者是共用一套数据。因此修改其中任何一个实例的数据,也会影响到另外那个。

class C{var data:Int = -1}
var x = C()
var y = x
x.data = 42
print("\(x.data),\(y.data)")  输出结构 42,42

值类型较引用类型来说,会更容易在大量的代码中理清状况。如果总是得到一个独立的拷贝出来的实例,就可以放心它不会被app里面的其他部分代码默默的修改。这在多线程的环境里面是尤为重要的,因为另外一个线程可能会在暗地里修改数据。因此可能造成程序的错误。

由于差别主要在修改数据的后果,那么当实例的数据只读,不存在只需要更改的情况下,用哪种类型都是没有分别得。

有时候可能也需要一个完全不变的类。这样使用Cocoa NSObject对象的时候会比较容易,又可以保留值语义的好处。实际上很多基本的Cocoa 类,比如NSURL 都是设计成不可变类的。然而,Swift语言目前只强制struct和enum这种值类型的不可变性,对类这种引用类型则没有。

如何选择类型?

当想要建立一个新的类型的时候,怎么决定用值类型还是引用类型呢?当使用Cocoa框架的时候,很多API都要通过NSObject的子类使用,所以这个时候必须要用到引用类型class。在其他情况下,有下面的几个准则:

1.什么时候该用值类型:
 a.要用==运算符来比较实例的数据时
 b.希望实例的拷贝能保持独立的状态时。
 c.数据会被多个线程使用时。
2. 什么时候用该用引用类型(class)
a.要用==运算符来比较实例身份的时候。
b.希望创建一个共享的、可变的对象的时候。

在swift里面,数组(Array)、字符串(String)、字典(Dictionary)都属于值类型。它们就像C语言里面简单的int值,是一个个独立的数据个体。不需要花任何的功夫来防范其他代码在暗地里修改他们。更重要的是,可以在线程之间安全的传递变量,而不需要特地去同步,

相关文章

  • swift里面的类型分类

    swift里面的类型分为两种: 值类型(Value Types):每个实例都保留了一份独有的数据拷贝,一般以结构体...

  • Swift5.1 - 指针Pointer

    指针分类 使用swift提供指针类型: UnsafePointer UnsafeMutablePointer Un...

  • swift UIButton-图文排列

    swift 里没有OC的分类概念,但可以用extension为类拓展方法。 下面的extension 为UIBut...

  • swift指针

    1、指针的类型 1.1、分类 swift中指针分为两类,typed pointer指定数据类型的指针,raw po...

  • [Swift5.1] 22-字面量

    字面量 上面代码中的10、false、"Jack"就是字面量 常见字面量的默认类型 Swift自带的绝大部分类型,...

  • Swift中数据类型

    Swift中数据类型 标签(空格分隔): Swift Swift类型的介绍 Swift中的数据类型也有:整型/浮点...

  • Swift中日期类型的分类

  • Swift中数据类型

    Swift类型的介绍 Swift中的类型推导 Swift中基本运算

  • 字面量(Literal)

    上面代码中的10,false,"Jack"就是字面量 常见字面量的默认类型 Swift自带的绝大部分类型,都支持直...

  • Swift5.1学习随笔之字面量Literal

    上面代码中的10、true、"jack"就是字面量 常见字面量的默认类型 Swift自带的绝大部分类型,都支持直接...

网友评论

      本文标题:swift里面的类型分类

      本文链接:https://www.haomeiwen.com/subject/nwdydftx.html