美文网首页Swift
Swift - Structures and Classes

Swift - Structures and Classes

作者: ienos | 来源:发表于2018-10-23 10:14 被阅读5次

Structures 和 Classes 的共同点

  • 定义一个存储属性
  • 定义一个提供功能的方法
  • 定义下标提供访问他们的值
  • 定义初始化器设置他们初始状态
  • 扩展他们的方法
  • 遵循协议

类有且结构体没有的能力

  • 继承
  • 类型转换
  • 允许类的实例释放其分配的任何资源
  • 引用计数

如何选择结构体和类

  • 默认使用结构体
  • 与 OC 混编时使用类
  • 当需要控制数据的标识使用类(共享实例和本地数据库对象)
  • 不需要控制标识时使用结构体(数据是从远程服务器获取)
  • 结构体和协议分享行为和模型继承:优先使用协议继承,因为协议允许类、结构体和枚举。类只能兼容其他类。

定义

struct Resolution {
     var width = 0
     var height = 0
}

class VideoMode {
     var resolution = Resolution()
     var interlaced = false
     var frameRate = 0.0
     var name: String?
}

初始化

let someResolution = Resolution()
let someVideoMode = VideoMode()
// 结构体有默认的成员初始化
let vga = Resolution(width: 640, height: 480)

访问属性

someVideoMode.resolution.width

值类型 -- Structures / Enumerations

定义: 当分配一个常量或变量、传递到方法时都会 copy

Basic Type: Integer / Float / Bool / String / Array / Dictionary

集合类型(数组、字典、字符串)使用了内存优化,不是立即拷贝。他们共享存储元素的内存介于初始实例和任何 copy 对象之间。

如果修改了一个集合的 copy,元素在修改之前被拷贝。在代码中看到的行为就是立即拷贝。

let hd = Resolution(width: 1920, height: 1080)
var cinema = hd
cinema.width = 2048
print("cinema is now \(cinema.width) pixels wide") // 2048
print("hd is still \(hd.width) piels wide") // 1920

引用类型 -- Class

定义:分配一个变量或常量、传递到方法时没有 copy。与值类型相反,总是使用相同的实例

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

let alsoTenEighty = tenEighty
alsoTenEighty.frameRate = 30.0

如果是引用类型,两个变量在源文件中相距甚远,很难发现是在哪里发生改变

标识操作符 -- 判断是否为同个实例

  • ===
  • !==
// 区别于 == 和 !=
if tenEighty === alsoTenEighty {
}

不需要像 C / C++ / ObjC 一样使用指针,引用同一个内存地址去创建引用。Swift 一个变量或常量去引用一个引用类型的实例(类似于指针),这些引用的定义和其他正常的常量和变量一致。

相关文章

网友评论

    本文标题:Swift - Structures and Classes

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