美文网首页
swift从零开始-10-类与结构体

swift从零开始-10-类与结构体

作者: SPIREJ | 来源:发表于2017-11-17 15:28 被阅读10次

1. 类和结构体对比
swift中类与结构体的共同处:

  • 1.定义属性用于存储值
  • 2.定义方法用于提供功能
  • 3.定义下标用于通过下标语法访问值
  • 4.定义初始化器用于生成初始化值
  • 5.通过扩展以增加默认实现的功能
  • 6.复合协议以对某类提供标准功能

与结构体相比,类还有如下的附加功能:

  • 1.继承,允许一个类继承另一个类的特征
  • 2.类型转换允许在运行时检查和解释一个类实例的类型
  • 3.取消初始化器允许一个类实例释放任何其所被分配的资源
  • 4.引用计数允许对一个类的多次引用

2. 定义
通过关键字 classstruct 来分别表示类和结构体

class SomeClass {
    //
}

struct SomeStruct {
    //
}

示例

/*
 名为Resolution的结构体,描述一个显示器的像素分辨率
 包含width 和 heigth 的存储属性
 */
struct Resolution {
    var width = 0
    var heigth = 0
}

/*
 VideoMode 类,描述一个视屏显示器的特定模式
 */
class VideoMode {
    var resolution = Resolution()
    var interlaced = false
    var frameRate = 0.0
    var name: String?
}

3. 类和结构体实例
生成结构体和类实例的语法非常相似:使用初始化语法,即在结构体名或类名后面跟随一个括号

let someResolution = Resolution()
let someVideoMode = VideoMode()
  • 属性访问:通过点语法
print("the width of someResolution is \(someResolution.width)")
print("the width of someVideoMode is \(someVideoMode.resolution.width)")
//也可以用点语法为属性变量赋值
someVideoMode.resolution.width = 1080

//结构体类型的成员逐一初始化器
let aoc = Resolution(width: 640, heigth: 480)
print(aoc.width,aoc.heigth)

4. 结构体和枚举是值类型
值类型被赋予一个变量,常量或者本身被传递给一个函数的时候,实际操作的是其的拷贝
在swift中,所有的基本类型:整型,浮点型,布尔型,字符串,数组,字典都是值类型,并且都是以结构体的形式在后台所实现
在swift中,所有的结构体和枚举都是值类型。它们的实例,一级实例包含的任何值类型属性,在代码中传递的时候都会被复制

let hd = Resolution(width: 1920, heigth: 1080)
var cinema = hd

代码可以这么看:声明一个名为hd的常量,其值初始化为高清视屏分辨率Resolution的实例
声明一个名为cinema的变量其值为之前声明的cinema,但是在后台他们两个是完全不同的实例

5. 类是引用类型
初始化一个VideoMode类的实例

let tenEighty = VideoMode()
tenEighty.resolution = hd
tenEighty.interlaced = true
tenEighty.frameRate = 25.0
tenEighty.name = "1080i"

因为类是引用类型,所以alsoTenEighty和tenEighty实际上是相同的VideoMode实例,所以改变了alsoTenEighty的属性值,tenEighty的也随之改变

let alsoTenEighty = tenEighty
alsoTenEighty.frameRate = 30.0
print(tenEighty.frameRate)
//30.0

6. 恒等运算符

  1. 等价于(===)
  2. 不等价于(!==)
  • “等价于”(===)与“等于”(==)的不同
  • 等价于 表示两个类类型的常量或者变量引用同一个类实例
  • 等于 表示两个实例的值相等 或者 相同

7. 类和结构体的选择
在你的代码中,你可以使用类和结构体来定义你的自定义数据类型。

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

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

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

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

几何形状的大小,封装一个width属性和height属性,两者均为Double类型。
一定范围内的路径,封装一个start属性和length属性,两者均为Int类型。
三维坐标系内一点,封装x,y和z属性,三者均为Double类型。
在所有其它案例中,定义一个类,生成一个它的实例,并通过引用来管理和传递。实际中,这意味着绝大部分的自定义数据构造都应该是类,而非结构体。

  • 集合类型的赋值与复制行为
    swift中数组(Array)和字典(Dictionary)类型均以结构体形式实现。然而当数组被赋予一个常量或变量,或被床底给一个函数或方法时,其拷贝行为与字典和其他结构体有些许不同。

  • 字典类型的赋值和拷贝行为
    无论何时将一个字典示例赋给一个常量或变量,或者传递给一个函数方法时,这个字典会在赋值或调用发生时被拷贝。
    如果字典实例中所存储的键(keys)和/或值(values)是值类型(结构体或枚举),当赋值或调用发生时,它们都会被拷贝。相反,如果键(keys)和/或值(values)是引用类型,被拷贝的将会是引用,而不是被它们引用的类示例或函数。字典的键值拷贝行为与结构体所存储的属性的拷贝行为相同。

var ages = ["A":23, "B":35, "C":18, "D":20]
var copyAges = ages

这个字典的键是String类型,值是Int类型,都是值类型,所以在拷贝时,两者都会被拷贝。赋值结束后,copyAges和ages成为两个相互独立的字典

copyAges["B"] = 22
print("ages B'age is \(ages["B"])")
//print ---> 35
  • 数组的赋值和拷贝行为
    1.在swift中数组类型的赋值和拷贝行为要比字典类型复杂的多。当操作数组内容时,数组能提供接近C语言的性能,并且拷贝行为只有在必要时才会发生。
    2.如果将一个数组(Array)实例赋给一个变量或常量,或者将其作为参数传递给函数或方法调用,在时间发生时数组的内容不会被拷贝。相反,数组公用相同的元素序列。
    3.对数组来说,拷贝行为仅仅当操作有可能修改数组长度时才会发生。这种欣慰包括附加(appending)插入(inserting)删除(removeing)或者使用范围下标去替换这一范围内的元素。只有当数组拷贝确要发生时,数组内容的行为规则与字典中兼职的相同
    例:
var a = [1,2,3]
var b = a
var c = a
print("a[0] = \(a[0]), b[0] = \(b[0]), c[0] = \(c[0])")
//a[0] = 1, b[0] = 1, c[0] = 1

a[0] = 42
//测试与文档说的不一致--待定
print("a[0] = \(a[0]), b[0] = \(b[0]), c[0] = \(c[0])")
//a[0] = 42, b[0] = 1, c[0] = 1
//[42, 2, 3] [1, 2, 3] [1, 2, 3]
  • 判定两个数组是否共用相同元素
    通过使用恒等运算符(===或!==)来判定两个数组或子数

相关文章

  • swift从零开始-10-类与结构体

    1. 类和结构体对比swift中类与结构体的共同处: 1.定义属性用于存储值 2.定义方法用于提供功能 3.定义下...

  • 第九章 类和结构体

    c++中,结构体是稍有不同的类,类能做的,结构体也可以; 而swift中,结构体与类有较大区别, 结构体与类的区别...

  • Swift结构体内存初探之写时复制

    Swift赋予了结构体很多余类相同的特性,以至于Swift推荐在程序中使用结构体来存储结构化数据(关于类与...

  • iOS知识点-8.类(class)和结构体(struct)有什么

    Swift Basics 类(class)和结构体(struct)有什么区别? Swift中,类是引用类型,结构体...

  • Swift学习_基本语法之枚举&类&结构体

    1.枚举 类和结构体 在swift中类和结构体类似,可以把结构体理解成是一种轻量级的类,在swift中结构体不仅可...

  • Swift第2次小结

    内容来源 Swift 5.1 教程 结构体和类 Swift 并不要求你为自定义的结构体和类的接口与实现代码分别创建...

  • Swift:类和结构体

    中文文档 一、类和结构体对比 Swift 中类和结构体有很多共同点。共同处在于: 与结构体相比,类还有如下的附加功...

  • Swift5.x-属性(中文文档)

    引言 继续学习Swift文档,从上一章节:结构体和类,我们学习了Swift结构体和类相关的内容,如结构体和类的定义...

  • Swift学习

    Swift类与结构体的区别 struct People {var name : Stringinit(name :...

  • swift4.0-11 类和结构体

    代码学习swift4.0, 类和结构体 //// main.swift// SwiftLearn11-类和结构...

网友评论

      本文标题:swift从零开始-10-类与结构体

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