Swift5.1 语言指南(十七) 反初始化
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/9739382.html
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
一个deinitializer一个类的实例被释放之前立即调用。您使用deinit
关键字编写deinitializers ,类似于使用init
关键字编写初始化程序的方式。Deinitializers仅适用于班级类型。
取消初始化如何运作
当不再需要实例时,Swift会自动释放您的实例,以释放资源。迅速通过处理实例的存储器管理自动引用计数(ARC),如在自动引用计数。通常,在取消分配实例时,您无需执行手动清理。但是,当您使用自己的资源时,可能需要自己执行一些额外的清理。例如,如果创建自定义类以打开文件并向其写入一些数据,则可能需要在取消分配类实例之前关闭该文件。
类定义每个类最多可以有一个deinitializer。deinitializer不接受任何参数,并且没有括号写入:
- deinit {
- // perform the deinitialization
- }
在实例解除分配之前,会自动调用取消初始化程序。您不能自己致电deinitializer。超类deinitializers由其子类继承,超类deinitializer在子类deinitializer实现的末尾自动调用。即使子类不提供自己的deinitializer,也始终调用超类deinitializers。
因为实例在调用deinitializer之后才被释放,所以deinitializer可以访问调用它的实例的所有属性,并可以根据这些属性修改其行为(例如查找需要关闭的文件的名称) )。
Deinitializers in Action
这是一个取消初始化的例子。这个例子定义了两种新类型,Bank
并且Player
,对于一个简单的游戏。该Bank
班级管理一种虚拟货币,其流通量永远不会超过10,000个。Bank
游戏中只能有一个,因此它Bank
被实现为具有类型属性和类的类来存储和管理其当前状态:
- class Bank {
- static var coinsInBank = 10_000
- static func distribute(coins numberOfCoinsRequested: Int) -> Int {
- let numberOfCoinsToVend = min(numberOfCoinsRequested, coinsInBank)
- coinsInBank -= numberOfCoinsToVend
- return numberOfCoinsToVend
- }
- static func receive(coins: Int) {
- coinsInBank += coins
- }
- }
Bank
跟踪其拥有的当前硬币数量coinsInBank
。它还提供两种方法 - distribute(coins:)
以及receive(coins:)
- 处理硬币的分配和收集。
该distribute(coins:)
方法在分发之前检查银行中是否有足够的硬币。如果没有足够的硬币,则Bank
返回的数字小于请求的数字(如果银行中没有剩余硬币,则返回零)。它返回一个整数值,表示提供的实际硬币数。
该receive(coins:)
方法简单地将收到的硬币数量添加回银行的硬币商店。
该Player
课程描述了游戏中的玩家。每个玩家在任何时候都有一定数量的硬币存放在他们的钱包里。这由玩家的coinsInPurse
财产代表:
- class Player {
- var coinsInPurse: Int
- init(coins: Int) {
- coinsInPurse = Bank.distribute(coins: coins)
- }
- func win(coins: Int) {
- coinsInPurse += Bank.distribute(coins: coins)
- }
- deinit {
- Bank.receive(coins: coinsInPurse)
- }
- }
Player
在初始化期间,每个实例初始化具有来自银行的指定数量的硬币的起始许可,但是Player
如果没有足够的硬币可用,则实例可以接收少于该数量的实例。
本Player
类定义了一个win(coins:)
方法,它获取一定数量从银行硬币,并将它们添加到玩家的钱包。该Player
班还实现了deinitializer,这被称为之前Player
实例被释放。在这里,deinitializer只是将所有玩家的硬币归还给银行:
- var playerOne: Player? = Player(coins: 100)
- print("A new player has joined the game with \(playerOne!.coinsInPurse) coins")
- // Prints "A new player has joined the game with 100 coins"
- print("There are now \(Bank.coinsInBank) coins left in the bank")
- // Prints "There are now 9900 coins left in the bank"
Player
创建一个新实例,如果可用则请求100个硬币。此Player
实例存储在Player
名为的可选变量中playerOne
。这里使用可选变量,因为玩家可以随时离开游戏。可选项可让您跟踪游戏中当前是否有玩家。
因为playerOne
它是可选的,!
当coinsInPurse
访问其属性以打印其默认硬币数时,无论何时win(coins:)
调用其方法,它都会被感叹号()限定:
- playerOne!.win(coins: 2_000)
- print("PlayerOne won 2000 coins & now has \(playerOne!.coinsInPurse) coins")
- // Prints "PlayerOne won 2000 coins & now has 2100 coins"
- print("The bank now only has \(Bank.coinsInBank) coins left")
- // Prints "The bank now only has 7900 coins left"
在这里,玩家赢得了2,000个硬币。玩家的钱包现在包含2,100个硬币,银行只剩下7,900个硬币。
- playerOne = nil
- print("PlayerOne has left the game")
- // Prints "PlayerOne has left the game"
- print("The bank now has \(Bank.coinsInBank) coins")
- // Prints "The bank now has 10000 coins"
玩家现在已离开游戏。这通过将可选playerOne
变量设置为表示nil
“无Player
实例” 来指示。在发生这种情况时,playerOne
变量对Player
实例的引用被破坏。没有其他属性或变量仍然引用该Player
实例,因此它被释放以释放其内存。就在这种情况发生之前,它的自动调节器会自动调用,并将其硬币返还给银行。
转载于:https://www.cnblogs.com/strengthen/p/9739382.html
Swift5.1 语言指南(十七) 反初始化相关推荐
- Swift5.1 语言指南(三) 快速之旅
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...
- Swift5.1 语言指南(一) 关于Swift
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...
- Swift5.1 语言指南(九) 闭包
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...
- Swift5.1 语言指南(二十三) 协议
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...
- Swift5.1 语言指南(二十) 类型转换
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...
- Swift5.1 语言指南(十三) 方法
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...
- Swift语言指南(十)--字符串与字符
原文:Swift语言指南(十)--字符串与字符 字符串是一段字符的有序集合,如"hellow,world"或"信天翁".Swift 中的字符串由 String ...
- 独立式环境与宿主式环境————《标准C语言指南》读书笔记01
独立式环境与宿主式环境----<标准C语言指南>读书笔记01 在编写和转换一个C程序之前,需要考虑它的执行环境,因为这关系到源文件的内容(程序应当如何编写),也关系到转换后的程序能否正常执 ...
- Swift语言指南(二)--语言基础之注释和分号
Swift语言指南(二)--语言基础之注释和分号 原文:Swift语言指南(二)--语言基础之注释和分号 注释 通过注释向自己的代码中注入不可执行的文本,作为你自己的笔记或提示.Swift编译器运行时 ...
- Swift语言指南(一)--语言基础之常量和变量
原文:Swift语言指南(一)--语言基础之常量和变量 Swift 是开发 iOS 及 OS X 应用的一门新编程语言,然而,它的开发体验与 C 或 Objective-C 有很多相似之处. Swif ...
最新文章
- 【Qt】通过QtCreator源码学习Qt(三):linux平台的信号、程序崩溃处理
- P1063 能量项链
- 利用正则表达式去除所有html标签,只保留文字
- 虚拟机登服务器,用虚拟机登录云服务器
- oracle 11g goldengate与oracle 11g数据同步
- NOTEPAD大神是否鄙视一切IDE?
- Java 算法 超级玛丽
- nodejs参数的接收(post和get)
- 原因为 1.无法找到文档; 2. 无法读取文档; 3. 文档的根元素不是xsd:schema
- python字典添加主键_字典的常见操作
- Unity3D 与udk 3D游戏动漫引擎的开发特点
- Axure RP 9.0 软件安装教程
- DIY 3D打印机测试
- Sketch教程|如何访问组件视图?
- 毕业设计之 --- 新闻分类系统
- html5黄油,天才黄油有油无油区别 天才黄油的正确用法
- 中兴--维克多博士问题(背包问题升级版)
- Rabbitmq 基础
- 雷电网络:前景,挑战,路线
- 大漠插件最新版7.2248
热门文章
- net.java.html.boot.BrowserBuilder
- HP LINUX打印机驱动安装步骤
- WIN10显示汉字都有问题?
- error LNK2005: DllMain 已经在MSVCRT.lib中定义
- C#中获得窗体的句柄
- LINUX编译OPENJDK:The tested endian intarget (big) differs from the endian expected to be found in the
- 银河麒麟双击deb包无法安装
- 连文件搜索都不会用,也不自己反省一下?
- php curl 缓存请求_PHP异步非阻塞实现方法
- VC++字符串类型转换