[译] 在 iOS Swift 中的懒加载变量

这篇文章解释了在 Swift 中懒加载变量是如何工做的,你必须对闭包有一些了解。前端

阅读这篇文章获取更多关于闭包的信息.android

当咱们进行 iOS 开发时,咱们应该很是关注应用程序的内存占用状况。若是应用程序很复杂,那么内存问题就会是对于开发者的一个主要的挑战。因此,首先考虑到内存分配问题的开发者可以真正的写出优化的代码。除非确实有必要,不然开发者要避免作一些耗时的工做。那些复杂的分配内存操做会消耗更多的时间,而且对于程序的性能有严重的影响。ios

Swift 有内置在语言中的机制,能够即时的计算那些耗时工做。它叫作懒加载变量。这种变量只有在你第一次须要它的时候才被指定的方法建立。若是从没有使用过该变量。那么方法就不会运行,因此它能够帮助减小一些处理时间。git

苹果的官方文档写道:github

一个懒加载储存属性是种只有在首次使用时,才计算其初始值的属性。你能够经过在声明前加 lazy 修饰符来标示一个懒加载存储属性。swift

你必须将一个懒加载属性声明为一个变量(经过 var 关键字),由于它的初始化值也许不能得到,直到实例的初始化完成。常量属性在初始化完成以前必定会有一个值,所以不能用懒加载声明。后端

为了解释这些,我会使用一个很基础的示例:假设有一个结构体叫作 InterviewCandidate。它有一个可选的布尔值,决定候选人正在申请 iOS 或者 Android。iOSResumeDescription 和 androidResumeDescription 被声明为懒加载属性。那么在下面的代码中,一我的是 iOS 开发者,懒加载变量 iOSResumeDescription 将会在调用打印方法的时候被初始化。没有被调用的 androidResumeDescription 就会是 nil。安全

//: Playground - noun: 人们用来玩耍的地方
import UIKit


struct InterviewCandidate {
    var isiOS:Bool?
    
    lazy var iOSResumeDescription: String = {
        return "I am an iOS developer"
    }()
    lazy var androidResumeDescription: String = {
        return "I am an android developer"
    }()
}

var person1 = InterviewCandidate()
person1.isiOS = true

if person1.isiOS! {
    print(person1.iOSResumeDescription)
} else {
    print(person1.androidResumeDescription)

}
复制代码

这是一个很是基础的例子。若是咱们有一个复杂的类或结构,它包含从循环的函数返回结果的计算变量,而且若是咱们建立 1000 个这样的对象,那么性能和内存将会受到影响。闭包

懒加载存储属性 vs 存储属性

这有一些懒加载属性相对于存储属性的优势。函数

  1. 只有在读取懒加载属性时,才会执行与该属性关联的闭包。 所以,若是因为某种缘由该属性未被使用(多是由于用户的某些决定),则能够避免没必要要的分配和计算。

  2. 你可使用一个存储属性给懒加载属性赋值。

  3. 注意 你可以在懒加载的属性闭包内部使用 self。这不会致使任何循环引用。缘由在于它当即使用的这个闭包 {}() 被认为是 @noescape。它不会引用捕获的 self

可是,若是你在 方法 中使用 self。事实上,若是你正在使用的是一个类而不是结构体,你也应该在你的方法内声明 [unowned self] 那样你才不会建立一个强引用(查看下面的代码)。

// playground code

import UIKit
import Foundation

class InterviewTest {
	var name: String
	lazy var greeting : String = { returnHello \(self.name)” }()
	// 这里没有循环引用 ..

	init(name: String) {
		self.name = name
	}
}

let testObj = InterviewTest(name:”abhi”)

testObj.greeting
复制代码

你可以引用这个变量,不管你是否使用了闭包。

lazy var iOSResumeDescription = “I am an iOS developer”
复制代码

这样的语法也能够运行。

注意:记住,懒加载属性的用途是只有它们第一次被须要的时候才会被计算,在这以后它们的值就被存储下来了。因此,若是你第二次使用 iOSResumeDescription,预先存储的属性就会返回。

懒加载规则:

  • 你不能对 let 类型使用 lazy

  • 你不能对于 计算属性 使用它。由于一个计算属性会在每次咱们试图访问它的时候去执行在计算代码块中的代码并返回相应的值。

  • 你只能对 structclass 的成员使用 lazy

  • 懒加载变量不是原子初始化类型,因此它并非线程安全的。

若是你喜欢阅读这篇文章,那么分享和推荐它以便其余人可以看到💚💚💚💚💚💚!

若是发现译文存在错误或其余须要改进的地方,欢迎到 掘金翻译计划 对译文进行修改并 PR,也可得到相应奖励积分。文章开头的 本文永久连接 即为本文在 GitHub 上的 MarkDown 连接。


掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 AndroidiOS前端后端区块链产品设计人工智能等领域,想要查看更多优质译文请持续关注 掘金翻译计划官方微博知乎专栏

相关文章
相关标签/搜索