[译] lazy var in ios swift

栏目: Swift · 发布时间: 4年前

内容简介:这篇文章解释了在 Swift 中懒加载变量是如何工作的,你必须对闭包有一些了解。当我们进行 iOS 开发时,我们应该非常关注应用程序的内存占用情况。如果应用程序很复杂,那么内存问题就会是对于开发者的一个主要的挑战。所以,首先考虑到内存分配问题的开发者能够真正的写出优化的代码。除非确实有必要,否则开发者要避免做一些耗时的工作。那些复杂的分配内存操作会消耗更多的时间,并且对于程序的性能有严重的影响。

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

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

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

[译] lazy var in ios swift

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 ,预先存储的属性就会返回。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

网页配色实用手册

网页配色实用手册

温鑫工作室 / 科学 / 2011-9 / 59.00元

《网页配色实用手册》在日常生活中,色彩早已广泛地深入到人们的精神生活和物质生活中,它是一种能够激发情感、刺激感官的重要元素。《网页配色实用手册》 从色彩的应用范围和网页设计行业需求出发而编写。全书共分为9章,第1章~第2章主要介绍色彩的基础知识、网页与多媒体的相关知识,帮助读者掌握最基本的理论;第3章主要介绍明度、纯度以及色彩感觉的配色,引领读者深入学习;第4章~第8章分别根据网站的属性、网站的地......一起来看看 《网页配色实用手册》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具