Day07:Swift 基础语法-Struct 与 Class 的差异

前言

前面两篇文章学习了 Struct 和 Class,
两者用法相同、功能相似,
都可以用来储存 property、定义 method,
具体可见官方文件:
https://docs.swift.org/swift-book/LanguageGuide/ClassesAndStructures.html
这篇文章主要会具体讨论 Struct 与 Class 的差异。

实作

  • Struct 和 String、Int、Double、Bool、Array 一样,
    都是 value type。
  • Class 是 reference type。

Struct

首先宣告一个新的 struct,

我们可以发现只宣告了一个实例却产生了两个不同的值,
这是因为宣告

var b = MyStruct()
var c = b

相当於宣告了 b、c 是两个不同的实例,
所以会出现两个不同的结果。
这是 Struct 作为 value type 的特殊属性:
当你宣告一个新变数给 value type,
或者把它传给一个 Function,
实际上它就是 copy 了一个副本并进行传递。

接下来传递一个参数 e 进入 myFunction(),
e 的 value type 是这个 struct:

Xcode 显示一个 error,
让我们调用 myFunction(),
并传入变数 b,
它将宣告 b 的副本并传递到 myFunction() 中:

可以看到 Xcode 不允许更改副本,
只有当直接赋值给变数,
才能更改 value type:

Class

让我们有一个新的 playground:

结果我们得到了同样的结果。
这是因为 Class 是 reference type,
它是作为 reference 作用传递的。
这意味着变数 b、c 指向同一个 class 的实例,
所以最後打印出来的结果反映的是最後一次的变更。
让我们调用 myFunction() 试试:

会发现打印出相同的结果。
这是因为 Class 是 reference type。


<<:  [2021铁人赛 Day07] General Skills 04

>>:  【第二十二天 - DFS 介绍】

D26 - 与MySQL相异的部分

因为一开始的目的之一是想要找一套兼容MySQL可尽量无痛转移的资料库,所以兼容程度是蛮重要的考量。官...

SAML Assertion and OIDC Claim

实体、身份和关联属性 所谓的实体(entity)是指任何具有身份(identity)的人或东西。例...

Day25 - 铁人付外挂测试验收(一) - 自动化测试

刚开始接案的时候,常常为了能赶在结案日来临之前把案子结掉,很多功能都是表面上能运作就拿去交差,心里虽...

DAY01 - [CSS+RWD] 满版、非满版区块显示

今天文章重点: - RWD 范围设定 - 事前准备 - 满版区块显示 - 非满版区块显示 - 实际...

React和DOM的那些事-节点更新

点击进入React源码调试仓库。 React的更新最终要落实到页面上,所以本文主要讲解DOM节点(H...