Swift开篇007->类和结构体

原创 2016年05月31日 18:15:07

PART_A 类&结构体对比

  1. 共同点

    • 定义属性:存储值

    • 定义方法:提供功能

    • 定义附属脚本:访问值

    • 定义构造器:生成初始化值

    • 通过扩展增加默认实现的功能

    • 实现协议以提供某种标准功能

  2. 类的附加功能

    • 继承允许一个类继承另一个类的特征

    • 类型转换允许在运行时检查和解释一个类实例的类型

    • 析构器允许一个类实例释放任何其所被分配的资源

    • 引用计数允许对一个类的多次引用(结构体总是通过被复制的方式在代码中传递,不使用引用计数)

  3. 语法格式

    // 结构体
    struct Resolution {
        // 当赋值 0 时,类型推断 wdith 为 Int 类型
        var width = 0 
        var height = 0
    }
    // 类
    class VideoMode {
        var resolution = Resolution()
        var interlaced = false
        var frameRate = 0.0
        var name: String?
    }
  4. 实例创建

    let demoResolution = Resolution()
    let demoVideoMode = VideoMode()
  5. 属性访问&变量属性赋值

    • 对象.属性名

    • 对象.属性名 = 值

  6. 结构体类型的成员逐一构造器

    • 所有结构体的新实例中各属性的初始值可通过属性的名称传递到成员逐一构造器中

      let vga = Resolution(width: 640, height: 480)


PART_B 结构体和枚举是值类型

  1. 所有基本类型(整型Integer、浮点型Float、布尔型Boolean、字符串String、数组Array、字典Dictionary)、枚举、结构体都是值类型. 赋值时仅为拷贝副本

    let hd = Resolution(width: 1920, height: 1080)
    var cinema = hd
    cinema.width = 2048
    // cinima.width 值为 2048, hd.width 值为 1920
  2. 类是引用类型:引用的是已存在的实例本身而不是其拷贝

    let tenEighty = VideoMode()
    tenEighty.resolution = hd
    tenEighty.interlaced = true
    tenEighty.name = "1080i"
    tenEighty.frameRate = 25.0
    
    
    let alsoTenEighty = tenEighty
    alsoTenEighty.frameRate = 30.0
    // tenEighty.frameRate 值为 30.0

    需要注意的是 tenEighty 和 alsoTenEighty 被声明为常量而不是变量. 然而你依然可以改变 tenEighty.frameRate 和 alsoTenEighty.frameRate,因为 tenEighty 和 alsoTenEighty 这两个常量的值并未改变. 它们并不“存储”这个 VideoMode 实例,而仅仅是对 VideoMode 实例的引用. 所以,改变的是被引用的 VideoMode 的 frameRate 属性,而不是引用 VideoMode 的常量的值

  3. 恒等运算:=====

    • ===:两个类类型的常量或变量引用同一个类实例

    • ==:两个实例的值相等

  4. 指针


PART_C 类和结构体的选择

  1. 大部分场景还是需要定义类,生成实例,通过引用来管理和传递

  2. 结构体场景

    • 该数据结构的主要目的是封装少量相关简单数据值

    • 有理由预计该数据结构的实例在被赋值或传递时,封装的数据将会被拷贝而不是被引用

    • 该数据结构中存储的值类型属性,也应该被拷贝,而不是被引用

    • 该数据结构不需要去继承另一个既有类型的属性或者行为

      如定义几何形状:长宽高、三维坐标系内一点:xyz等


补充

1..Swift StringArrayDictionary以结构体的形式实现,即被赋值给新的常量或变量、或被传入方法中时,其值会被拷贝

2..OC 中 NSStringNSArrayNSDictionary 类型均以类的形式实现,其不会发生值拷贝,而是传递现有实例的引用


以上。如有错误和疑问,欢迎指正提出。catface.wyh@gmail.com

版权声明:本文为博主原创文章,如需转载请声明作者信息,谢谢。

PAT L2-007. 家庭房产 并查集的结构体合并

L2-007. 家庭房产时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数、人均房产面积及房产套...
  • dl2hq
  • dl2hq
  • 2017年03月24日 17:08
  • 63

Swift高级开发语言--结构体,类,构造器,属性

// 结构体和类 // 在swift中,结构体被做了很多强化,几乎所有的数据类型都是用结构体实现的, // 相同点:1.都可以定义变量 2.都可以定义方法 3.都可以定义构造器 init 4.都...

Swift-类和结构体(Class and Structures)(八)

前言与其他编程语言不通,Swift并不要求我们为自定义的类和结构体去创建独立的接口和实现文件。我们所要做的就是在一个单一文件中定义一个类或者结构体,系统将会自动生成面向其他代码的外部接口。 小节包...
  • xxh0307
  • xxh0307
  • 2016年05月10日 09:58
  • 568

Swift 基本知识点之八 —类与结构体

属性 1 存储属性 2 计算属性 3 属性观察器 4 全局变量和局部变量 5 类型属性(1)属性将值跟特定的类、结构或枚举关联。存储属性存储常量或变量作为实例的一部分,而计算属性计算(不是存...

[Swift]:快速学习笔记3 类和结构体

代码下载(playground文件): Swift快速学习笔记
  • annkie
  • annkie
  • 2015年12月26日 12:52
  • 1020

swift基础笔记4-类和结构体

类和结构体对比类和结构体是人们构建代码所用的一种通用且灵活的构造体。我们可以使用完全相同的语法规则来为类和结构体 定义属性(常量、变量)和添加方法,从而扩展类和结构体的功能。 Swift 并不要求...

Swift 类,结构体,枚举使用总结

类,结构体,枚举既有相同之处,也有不同之处. 相同之处在于: 1:都可以通过定义不同的属性来保存自己的数据. 2:都可以通过定义方法来实现不同的功能. 3:都可以在定义下标方法后,通过下标方法的语法...

Swift语法学习之 类和结构体

类和结构体本页包含内容:类和结构体对比 结构体和枚举是值类型 类是引用类型 类和结构体的选择 集合(collection)类型的赋值与复制行为与其他编程语言所不同的是,Swift 并不要求你为...

ios深度解析之Swift(结构体和类,属性)

// 结构体 和 类 // 在Swift中,结构体被做了很对强化 几乎所有的数据类型都是用结构体实现的 // 相同点: 1.都可以定义变量 2.都可以定义方法 3.都可以定义构造器 Int 4.都可...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Swift开篇007->类和结构体
举报原因:
原因补充:

(最多只允许输入30个字)