学Swift挣美元08之Struct和class的关系

本系列教程

  • 请点击,免费订阅《学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

你可能感兴趣的:(学Swift挣美元08之Struct和class的关系)