Swift

Swift - Structures and Classes

2018-10-23  本文已影响5人  ienos

Structures 和 Classes 的共同点

类有且结构体没有的能力

如何选择结构体和类

定义

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 一个变量或常量去引用一个引用类型的实例(类似于指针),这些引用的定义和其他正常的常量和变量一致。

上一篇 下一篇

猜你喜欢

热点阅读