zoukankan      html  css  js  c++  java
  • swift 值类型和引用类型

    值类型

    值类型被赋予给一个变量,常数或者本身被传递给一个函数的时候,实际上操作的是其的拷贝。
    在 Swift 中,所有的基本类型:
    整数(Integer)、浮点数(floating-point)、布尔值(Booleans)、字符串(string)、数组(array)和字典(dictionaries),都是值类型,
    并且都是以结构体的形式在后台所实现。
    在 Swift 中,所有的结构体和枚举都是值类型。这意味着它们的实例,以及实例中所包含的任何值类型属性,在代码中传递的时候都会被复制。

    集合(Collection)类型的赋值和拷贝行为

    Swift 中数组(Array)和字典(Dictionary)类型均以结构体的形式实现。
    然而当数组被赋予一个常量或变量,或被传递给一个函数或方法时,其拷贝行为与字典和其它结构体有些许不同。
    以下是对于数组,字典,字符串和其它值的拷贝的描述:

      在你的代码中,拷贝好像是确实是在有拷贝行为的地方产生过。  然而,在 Swift 的后台中,只有确有必要,实际(actual)拷贝才会被执行。
      Swift 管理所有的值拷贝以确保性能最优化的性能,  所以你也没有必要去避免赋值以保证最优性能。(实际赋值由系统管理优化)
    

    实际上我也不明白..就暂且当数组和字典在拷贝的时候是引用类型的

    引用类型

    引用类型在被赋予到一个变量、常量或者被传递到一个函数时,操作的是引用,其并不是拷贝。因此,引用的是已存在的实例本身而不是其拷贝。

    let tenEighty = VideoMode()
    tenEighty.resolution = hd
    tenEighty.interlaced = true
    tenEighty.name = "1080i"
    tenEighty.frameRate = 25.0
    
    let alsoTenEighty = tenEighty
    alsoTenEighty.frameRate = 30.0
    
    if tenEighty === alsoTenTighty {
        println("tenTighty and alsoTenEighty refer to the same Resolution instance.")
    }
    
    请注意“等价于"(用三个等号表示,===) 与“等于"(用两个等号表示,==)的不同:
    “等价于”表示两个类类型(class type)的常量或者变量引用同一个类实例。
    等于”表示两个实例的值“相等”或“相同”,判定时要遵照类设计者定义定义的评判标准,因此相比于“相等”,这是一种更加合适的叫法。

    类和结构体的选择

    然而,结构体实例总是通过值传递,类实例总是通过引用传递。这意味两者适用不同的任务。当你在考虑一个工程项目的数据构造和功能的时候,你需要决定每个数据构造是定义成类还是结构体。

    按照通用的准则,当符合一条或多条以下条件时,请考虑构建结构体:

    • 结构体的主要目的是用来封装少量相关简单数据值。
    • 有理由预计一个结构体实例在赋值或传递时,封装的数据将会被拷贝而不是被引用。
    • 任何在结构体中储存的值类型属性,也将会被拷贝,而不是被引用。
    • 结构体不需要去继承另一个已存在类型的属性或者行为。

    合适的结构体候选者包括:

    • 几何形状的大小,封装一个width属性和height属性,两者均为Double类型。
    • 一定范围内的路径,封装一个start属性和length属性,两者均为Int类型。
    • 三维坐标系内一点,封装xyz属性,三者均为Double类型。

    在所有其它案例中,定义一个类,生成一个它的实例,并通过引用来管理和传递。实际中,这意味着绝大部分的自定义数据构造都应该是类,而非结构体。

  • 相关阅读:
    HDU 5642 King's Order 动态规划
    HDU 5640 King's Cake GCD
    HDU 5641 King's Phone 模拟
    HDU 5299 Circles Game 博弈论 暴力
    HDU 5294 Tricks Device 网络流 最短路
    HDU 5289 Assignment rmq
    HDU 5288 OO’s Sequence 水题
    星际争霸 虚空之遗 人族5BB 操作流程
    Codeforces Beta Round #3 D. Least Cost Bracket Sequence 优先队列
    Codeforces Beta Round #3 C. Tic-tac-toe 模拟题
  • 原文地址:https://www.cnblogs.com/zhepama/p/3857306.html
Copyright © 2011-2022 走看看