在我学习swift的过程中,我发现Lazy的概念有点困惑。惰性属性在类实例需要或访问时初始化classEmployee{varname:Stringlazyvarsalary=Salary(Basic:25000,HRA:3000,DA:4000)lazyvarminExperience=0init(nameValue:String){name=nameValue}}varemp1=Employee("John")//HeretheminExperienceand//salarywillbenilastheyarenotassignedanyspace=//emp1.salary.st
我刚刚看到一个线程,询问惰性集合。它们看起来像这样:letarray=Array(1...10).lazy文档是这样描述惰性集合的:“一个集合包含与Base集合相同的元素,但在其上延迟实现了一些操作,例如map和filter。”这个想法是避免大量的中间集合。如果您有这样的代码:设数组=1...10.filter{$0%2==0}.sorted{$0然后代码中的每一步都会创建一个中间数组。对于大型阵列,这可能会占用大量内存。不过,在使用惰性进行试验时,我发现如果处理惰性集合的一个或多个步骤在每次执行时都返回不同的结果,则可能会导致问题/崩溃。考虑这段代码:@discardableResu
我正在尝试使用@lazy属性按需加载属性,但我需要将成员变量传递到延迟加载实例的初始化器中。举个例子classWorker{init(AnyObjectcontext){...}}classHive{letcontext:AnyObjectinit(AnyObjectcontext){self.context=context}@lazyvarworker=Worker(self.context)//Thisdoesnotwork}有没有办法将成员变量注入(inject)到延迟加载的属性中?这是我相当烦人的解决方法:classHive{//initializerandcontextcon
使用由另一个属性支持的计算属性是否比在Swift中使用lazy修饰符更安全?//method1:usingLAZYvariablelazyvarmyVar:Int{//assumethatthiscalculationtakes//alotoftimeandresourcesreturn5}现在考虑Apple的Swift2(预发行版)中的以下引述:NOTEIfapropertymarkedwiththelazymodifierisaccessedbymultiplethreadssimultaneouslyandthepropertyhasnotyetbeeninitialized,t
为什么Swift有“惰性变量”和“计算属性”的概念,而简单的方法或函数似乎就适合这个目的?在computingPi的耗时情况下,这不应该是一种方法吗?在thiscase中也一样.为什么要强制某些东西成为一个显然更复杂的变量/属性? 最佳答案 回答:惰性变量的存在是为了缩短加载时间(即出于优化原因)。除非明确要求,否则不需要立即使用某些变量。而且它们,例如Math.pi可能需要一段时间才能计算。因此,当最重要的用户启动操作完成时,应用程序可能会在后台线程中开始计算它们。至于计算属性,我认为它更像是一种语言决定。Objective-C很
在Swift4.1之前,我使用flatMap从集合中删除nil值。现在此方法已弃用,我需要将其替换为compactMap。有时我使用带有惰性集合的flatMap来优化我的代码,就像这样:letoptionalIntegers:[Int?]=[1,2,nil,3,4,nil,nil,5]optionalIntegers.lazy.flatMap{$0}.forEach{print("Item\($0*10)")}如果我使用compactMap而不是flatMap会有同样的效果吗?在方法lazy的文档中,我发现仅引用了map和filter。 最佳答案
苹果文档是这样说的Ifapropertymarkedwiththelazymodifierisaccessedbymultiplethreadssimultaneouslyandthepropertyhasnotyetbeeninitialized,thereisnoguaranteethatthepropertywillbeinitializedonlyonce.我的问题是多次初始化属性的潜在影响是什么?如果一个属性被多次初始化,将使用其中的哪一个?Swift如何管理它们?我浏览了一些答案。Isitnormalthatlazyvarpropertyisinitializedtwice
我有一个关于如何对包含函数的类变量进行延迟初始化的问题。在我正在处理的项目中-在ViewController中-我需要根据只有在创建ViewController后才知道的信息运行一个函数。因此,我想使用惰性初始化来解决这个问题。我想我可以通过其他方式解决问题,但现在我很好奇我对延迟初始化不了解的地方,以至于我很难弄清楚如何获取延迟初始化的变量来保存函数。也就是说,如果可以的话。这是我正在尝试做的一些示例代码。我希望能够在TestClass的实例上调用talk()然后这个实例(在本例中为tc)调用f()根据情况可以是foo或bar。classTestClass{funcfoo(){pri
考虑这个例子classFoo{privateletbar="bar"lazyvarbaz:String={return"baz\(bar)"}()}不幸的是,这不会编译并给出以下错误'Foo.Type'doesnothaveamembernamed'bar'我真的不想在类外(全局)声明bar。没有其他方法可以将它保留在类中吗?为什么首先不能访问bar? 最佳答案 TL;DR:以self开头Swift可能会误导错误消息,但在这种情况下,可以从消息中推断出答案。它正在寻找类型Foo.Type上的bar,而您正试图引用一个实例变量。这是有
似乎惰性初始化很棒。我理解这个概念并测试了我的代码,我没有看到任何滞后。那么问题来了,为什么不总是使用惰性初始化呢?这有什么缺点?我没有意识到什么? 最佳答案 考虑这个惰性变量的例子:structS{lazyvarlazyVar:Int={/*computesomevalue*/0}()}幕后真正发生的事情是这样的:structS{var_lazyVar:Int?=nilvarlazyVar:Int{mutatingget{ifletexistingValue=_lazyVar{returnexistingValue}else{le