Swift 3.0基础学习之类与结构体

2020-01-08 23:35:47王冬梅

前言

和其他语言不同的是,Swift不需要为自定义的类和结构体创建接口和实现文件。只需要创建单一文件用来创建类和结构体,其他的外部接口的代码系统会自动生成。下面易采站长站为您分析关于Swift 3.0类与结构体的内容,感兴趣的朋友一起来看看吧。

类和结构体区别

Swift的类和结构体具有以下相同的特点:

可以定义属性来保存值 可以定义方法来提供功能 可以定义下标来使用他们的值 可以定义初始化器来配置他们的初始化状态 可以在默认的实现上扩展他们的功能 遵从协议来提供标准的功能

类具有结构体没有的额外的功能:

继承允许某一个类继承另外一个类的特性 类型转换允许你检查并在运行时解释一个类实例的类型 析构器允许释放所有该类已经赋值的实例资源 引用计数允许多个引用一个类的实例

结构体一般来说赋值的时候是直接拷贝的,没有使用引用计数的机制。

符号定义

下面是一个定义结构体和类的例子:


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

结构体初始化的时候可以直接


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

这点和类不一样,类没有默认的逐个成员的初始化器。

结构体和枚举是值类型


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

再赋值


cinema.width = 2048

结果


print("cinema is now (cinema.width) pixels wide")
// Prints "cinema is now 2048 pixels wide"

然而hd.width还是1920


print("hd is still (hd.width) pixels wide")
// Prints "hd is still 1920 pixels wide"

可见赋值过程是做了一次深度拷贝。

枚举也是具有同样的行为, 如以下例子,rememberedDirection的值并没有改变:


enum CompassPoint {
 case north, south, east, west
}
var currentDirection = CompassPoint.west
let rememberedDirection = currentDirection
currentDirection = .east
if rememberedDirection == .west {
 print("The remembered direction is still .west")
}
// Prints "The remembered direction is still .west"

类是引用类型

例如:


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

进行赋值引用


let alsoTenEighty = tenEighty
alsoTenEighty.frameRate = 30.0