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

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

原文地址:lazy var in ios swift
原文作者:Abhimuralidharan
译文出自:掘金翻译计划
本文永久链接:github.com/xitu/gold-m…
译者:kirinzer
校对者:portandbridge, iWeslie


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

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

当我们进行 iOS 开发时,我们应该非常关注应用程序的内存占用情况。如果应用程序很复杂,那么内存问题就会是对于开发者的一个主要的挑战。所以,首先考虑到内存分配问题的开发者能够真正的写出优化的代码。除非确实有必要,否则开发者要避免做一些耗时的工作。那些复杂的分配内存操作会消耗更多的时间,并且对于程序的性能有严重的影响。
image.png

Swift 有内置在语言中的机制,可以即时的计算那些耗时工作。它叫做懒加载变量。这种变量只有在你第一次需要它的时候才被指定的方法创建。如果从没有使用过该变量。那么方法就不会运行,所以它可以帮助减少一些处理时间。

苹果的官方文档写道:

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

你必须将一个懒加载属性声明为一个变量(通过 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 = { return “Hello \(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。
  • 你不能对于 计算属性 使用它。因为一个计算属性会在每次我们试图访问它的时候去执行在计算代码块中的代码并返回相应的值。
  • 你只能对 struct 和 class 的成员使用 lazy。
  • 懒加载变量不是原子初始化类型,所以它并不是线程安全的。
目录
相关文章
|
6月前
|
Swift iOS开发
iOS Swift使用Alamofire请求本地服务器报错-1002
iOS Swift使用Alamofire请求本地服务器报错-1002
148 1
|
3月前
|
安全 Swift iOS开发
Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法
本文深入探讨了 Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法。Swift 以其简洁、高效和类型安全的特点,结合 UIKit 丰富的组件和功能,为开发者提供了强大的工具。文章从 Swift 的语法优势、类型安全、编程模型以及与 UIKit 的集成,到 UIKit 的主要组件和功能,再到构建界面的实践技巧和实际案例分析,全面介绍了如何利用这些技术创建高质量的用户界面。
70 2
|
3月前
|
设计模式 安全 测试技术
Swift代码审查的关键点及最佳实践,涵盖代码风格一致性、变量使用合理性、函数设计、错误处理、性能优化、安全性、代码注释等方面,旨在提升代码质量和项目管理水平
本文深入探讨了Swift代码审查的关键点及最佳实践,涵盖代码风格一致性、变量使用合理性、函数设计、错误处理、性能优化、安全性、代码注释等方面,旨在提升代码质量和项目管理水平。通过实际案例分析,展示了如何有效应用这些原则,确保代码的高可读性、可维护性和可靠性。
50 2
|
3月前
|
安全 数据处理 Swift
深入探索iOS开发中的Swift语言特性
本文旨在为开发者提供对Swift语言在iOS平台开发的深度理解,涵盖从基础语法到高级特性的全面分析。通过具体案例和代码示例,揭示Swift如何简化编程过程、提高代码效率,并促进iOS应用的创新。文章不仅适合初学者作为入门指南,也适合有经验的开发者深化对Swift语言的认识。
83 9
|
3月前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户点击按钮时,按钮将从圆形变为椭圆形,颜色从蓝色渐变到绿色;释放按钮时,动画以相反方式恢复。通过UIView的动画方法和弹簧动画效果,实现平滑自然的过渡。
93 1
|
3月前
|
存储 大数据 编译器
Swift 变量
10月更文挑战第24天
30 2
|
3月前
|
安全 API Swift
探索iOS开发中的Swift语言之美
【10月更文挑战第23天】在数字时代的浪潮中,iOS开发如同一艘航船,而Swift语言则是推动这艘船前进的风帆。本文将带你领略Swift的独特魅力,从语法到设计哲学,再到实际应用案例,我们将一步步深入这个现代编程语言的世界。你将发现,Swift不仅仅是一种编程语言,它是苹果生态系统中的一个创新工具,它让iOS开发变得更加高效、安全和有趣。让我们一起启航,探索Swift的奥秘,感受编程的乐趣。
|
4月前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
【10月更文挑战第18天】本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户按下按钮时,按钮将从圆形变为椭圆形并从蓝色渐变为绿色;释放按钮时,动画恢复原状。通过UIView的动画方法和弹簧动画效果,实现平滑自然的动画过渡。
77 5
|
4月前
|
安全 Swift iOS开发
探索iOS开发中的Swift语言之美
在数字时代的浪潮中,移动应用已成为日常生活的延伸。本文将深入探讨iOS平台上的Swift编程语言,揭示其背后的设计哲学、语法特性以及如何利用Swift进行高效开发。我们将通过实际代码示例,展示Swift语言的强大功能和优雅简洁的编程风格,引导读者理解并运用Swift解决实际问题。
|
5月前
|
安全 Swift iOS开发
探索iOS开发之旅:Swift语言的魅力与挑战
【9月更文挑战第21天】在这篇文章中,我们将一起潜入iOS开发的海洋,探索Swift这门现代编程语言的独特之处。从简洁的语法到强大的功能,Swift旨在让开发者能够以更高效、更安全的方式构建应用程序。通过实际代码示例,我们会深入了解Swift如何简化复杂任务,并讨论它面临的挑战和未来的发展方向。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和知识。
62 4

热门文章

最新文章

相关课程

更多