学Swift挣美元08之Struct和class的关系
2019-03-13 本文已影响120人
iCloudEnd
本系列教程
- 请点击,免费订阅《学Swift挣美元》专栏
- 《2019年学好Swift,一起挣美金吧》
- 《学Swift挣美元01之Swift语言发展历史》
- 《学Swift挣美元02之学习资源》
- 《学Swift挣美元03之第一个程序》
- 《学Swift挣美元04之基础类型(来个古诗程序)》
- 《学Swift挣美元05之函数(游戏里的组合拳)》
- 《学Swift挣美元06之类(九阳神功)》
- 《学Swift挣美元06之类 续篇再说class 》
- 《学Swift挣美元07之数据结构(Struct) 》
- 《学Swift挣美元08之Struct和class的关系 》
学Swift挣美元08之Struct和class的关系
面向对象非常适合于封装具有统一性和相互引用行的数据和功能。然而,并不是所有的事物都是对象。通常,我们仅仅把一些数据逻辑放到一块,他们和合集的关系不过是总体与部分的关系。
从C语言时代,structs就用于描述上面的关系。Structs 是值类型,下面我来体验一下structs是如何工作的。
代码
import UIKit
struct PersonName {
let givenName:String
let middleName:String
var familyName:String
func fullName() -> String {
return "\(givenName) \(middleName)\(familyName)"
}
mutating func change(familyName:String){
self.familyName = familyName
}
}
var alissasName = PersonName(givenName:"Alissa",middleName:"May",familyName:"Jones")
}
分析
定义一个struct和定义class对象非常类型,这个是有意为之的。类的大部分都功能都可以应用于struct。
在PersonName中,我们定义了三个属性,familyName是变量类型,后期我们可以通过函数修改。
mutating 属性
在change函数前我们,使用一个新的属性值mutating。mutating这个关键词将告诉编译器当我们修改一个struct时,将使用新值创建一个新的副本。这个称为值类型语言(value-type semantics)
测试一下mutating 特性
llet alissasBirthName = PersonName(givenName: "Alissa", middleName: "May",
familyName: "Jones")
print(alissasName.fullName()) // Alissa May Jones
var alissasCurrentName = alissasBirthName
print(alissasName.fullName()) // Alissa May Jones
alissasCurrentName.change(familyName: "Moon")
print(alissasBirthName.fullName()) // Alissa May Jones
print(alissasCurrentName.fullName()) // Alissa May Moon
程序输出
Alissa MayJones
Alissa MayJones
Alissa MayJones
Alissa MayMoon
通过结果我们可以发现,struct类型每次赋值就是一次新副本的产生。这个class不同,class的赋值仅仅是引用的传递。
注意:更多参考信息可以参考ClassesAndStructures