美文网首页
Swift 引用类型和值类型

Swift 引用类型和值类型

作者: 不知道是哪个号 | 来源:发表于2020-03-07 20:06 被阅读0次

swift中类型主要分两类,分别是值类型和引用类型。这两种类型的功能类似于OC中的深拷贝和浅拷贝。

类型定义 定义类型
值类型 每个实例保留其数据的唯一副本 struct、enum和tuple
引用类型 实例共享数据的单个副本 class

值类型

值类型通常被定义为 struct、enum和tuple。他的主要特点是,每个实例都保留其数据的唯一副本,通俗点说修改 A 实例中的值不会影响到 B 实例。如下所示

struct S {
    var data = 1
}
    
func valueTypeMethod() {
    var a = S()
    let b = a
    print("\(a.data),\(b.data)") // 1,1
    a.data = 2 //改变a中的值
    print("\(a.data),\(b.data)") // 2,1
}

引用类型

引用类型通常被定义为 class。他主要的特点是,实例共享数据的单个副本,通俗点说修改 A 实例中的值会影响到 B 实例。如下所示:

class C {
    var data = 1
}
    
func referenceTypeMethod() {
    var a = C()
    let b = a
    print("\(a.data),\(b.data)") // 1,1
    a.data = 2 //改变a中的值
    print("\(a.data),\(b.data)") // 2,2
}

为什么会存在这两种类型

swift 为什么会同时存在引用类型和值类型,引用类型是不是能满足一切,那为什么还有值类型呢?

想想如果在多线程环境中使用引用类型,此时我们始终获得一个唯一的实例,但是不同的线程可能会同时对实例进行,这时可能会产生难以预料的错误,而这种错误很难进行调试分析。如果是值类型,我们可以通过分析不同的实例,来帮我们轻松的查找和推理代码中出现的问题。

还有一种情况是当实例中没有数据可进行更改时,值类型和引用类型的行为是完全相同的。如果某个类完全不可变,可能会更有价值,swift 中要实现这样的类可以通过结合不可变的属性和避免公开状态的API来实现。而它目前没有提供任何语言机制来实现对结构和枚举的不可变性。OC 中许多累被设计成不可变例如 NSURL。

两种类型如何选择?

在 OC 中,许多 API 都是 NSObject 的子类,当我们在swift中新建一个类型时,如何去选择?

选择值类型

  1. 实例数据间进行 == 比较有意义
  2. 副本具有独立的状态
  3. 数据将在多个线程中使用

选择引用类型

  1. 实例之间进行 === 比较有意义
  2. 实例内数据的变化需要共享

以上内容参考以下文章

Value and Reference Types

相关文章

  • Swift值类型&引用类型

    Swift值类型&引用类型 前言 值类型和引用类型是Swift中两种数据存储方式,简单来说值类型就是直接存储的值,...

  • swift的值类型和引用类型

    swift的类型有哪些?   swift的类型分为值类型和引用类型两种。值类型在传递和赋值时将进行复制,而引用类型...

  • Swift使用(一)数据类型,常量、变量、元组

    Swift数据类型,常量、变量、元组 数据类型 Swift分为值类型和引用类型: 1、值类型分为枚举enum 和 ...

  • 值类型和引用类型

    // 值类型和引用类型 // Swift 中 Int, Bool,struct, enum 是值类型,甚至 Str...

  • Swift 关键词 -- struct/enum/mutatin

    struct struct 值引用 在swift中,类型引用和值引用的区别在于,对于类型引用(class refe...

  • swift的值类型和引用类型

    Swift 值类型和引用类型 值类型包括:所有基本类型:整型(Int),浮点型(float),布尔类型(Boole...

  • 笔记01 swift 基础语法

    swift 常见数据类型 包括 值类型和引用类型 值类型 包括 枚举 optional 结构体(Bool Int...

  • Class和Struct比较

    从类型上看,在Swift中,Class是引用类型,Struct是值类型。值类型在传递和赋值的时候进行深复制,而引用...

  • Note 3 Swift (1)

    Swift学习笔记 变量与常量 变量 常量 值类型与引用类型 值类型 引用类型 数组与字典 数组 字典

  • iOS Swift 值类型与引用类型使用区别

    值类型在传递和赋值时将进行复制,而引用类型只会使用引用对象。Swift中定义的很多类型都是值类型,如struct、...

网友评论

      本文标题:Swift 引用类型和值类型

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