草庐IT

ios - 什么时候使用?、!、无或惰性?

我刚开始学习Swift,最近才发现“正常”变量(因为缺少更好的名称):ex:vartest1:String“可选”变量ex:vartest2:String?“隐式展开可选”ex:vartest3:String!惰性变量例如:lazyvartest4:String我的理解是这样的:使用“可选”变量(?)当变量可能会或可能不会在未来从初始化开始的时间点被初始化在保证变量被初始化时使用“隐式解包选项”(!)可选项可以通过“强制展开”转换为隐式展开的可选项例如:让可能的字符串:字符串?=“你好”println(possibleString!)当在初始化之前不需要设置某些东西时使用“惰性变量”(

ios - Swift 2/XCode 7 中惰性变量中的字符串文字 [无法转换字符串类型的值 ...]

每当String文字出现在lazyvar的声明中时,我会在Swift2/XCode7中遇到编译错误:CannotconvertvalueoftypeStringtoexpectedargumenttype'(_builtinStringLiteral:RawPointer,byteSize:Word,isASCII:Int1)'...(我在Swift1.2/XCode6中没有问题)产生此错误的最简单的行如下所示:lazyvarfoo="bar"但更相关(令人讨厌)的是,它也发生在接受字符串参数的初始化器中:lazyvarviewsLabel=HWLabel(color:COLOR_WH

使用 self 进行 Swift 惰性实例化

我有一些事情真的让我很困惑,特别是下面的代码触发了一个编译器错误“unresolvedidentifierself”,我不确定为什么会这样,因为懒惰意味着在使用属性时,类已经实例化了。我错过了什么吗?非常感谢。这是代码classFirstClass{unownedvarsecond:SecondClassinit(second:SecondClass){self.second=secondprint("Firstreportingforduty")}funcaMethod(){print("First'smethodreportingforduty")}}classSecondClas

Swift:将协议(protocol)变量实现为惰性变量?

似乎无法使用惰性变量来实现协议(protocol)所需的变量。例如:protocolFoo{varfoo:String{get}}structBar:Foo{lazyvarfoo:String="HelloWorld"}编译器提示Type'Bar'doesnotconformtoprotocol'Foo'.也无法添加lazy协议(protocol)声明中的关键字,从那以后你得到'lazy'isn'tallowedonaprotocolrequirement错误。所以这根本不可能吗? 最佳答案 引用theLanguageGuide-P

ios - 通过将属性设置为 nil 在 Swift 中再次触发惰性初始化器

我想要一个延迟初始化的属性,如果我将该属性设置为nil,我可以再次调用其初始化器。如果我这样定义我的属性:lazyvarobject={/*initcode*/}()...然后调用该属性,初始化器被触发一次。但是,如果我稍后在我的程序中将object设置为nil,则不会再次调用初始化程序。我如何在Swift中做到这一点?我研究了计算属性,但它们实际上并不存储值,所以每当我调用变量时,计算或初始化总是发生。我只想在属性为nil时计算。 最佳答案 惰性属性初始化器负责在第一次以读取模式访问时初始化属性。设置为nil对初始化状态没有影响-

ios - 多次加载的 Swift 惰性变量(计算属性?)

我正在尝试翻译一些本质上是多次延迟加载变量的Objective-C代码。代码类似于以下内容:-(NSFetchedResultsController*)fetchedResultsController{if(_fetchedResultsController!=nil){return_fetchedResultsController;}//...codetobuildthefetchedResultsControllerwithanewpredicate每当他们想要重建fetchedResultsController以使用新谓词时,他们只需将其设置为“nil”并调用它,它就会使用新谓词

swift - 惰性初始化和保留周期

在使用惰性初始化器时,是否有可能出现保留循环?在blogpost中和许多其他地方[unownedself]可见classPerson{varname:StringlazyvarpersonalizedGreeting:String={[unownedself]inreturn"Hello,\(self.name)!"}()init(name:String){self.name=name}}我试过了classPerson{varname:StringlazyvarpersonalizedGreeting:String={//[unownedself]inreturn"Hello,\(se

swift - Swift 中的惰性变量是否被多次计算?

Swift中的惰性变量是否计算了不止一次?我的印象是他们取代了:if(instanceVariable){returninstanceVariable;}//setupvariablethathasnotbeeninitialized来自Objective-C的范例(惰性实例化)。这就是他们所做的吗?基本上只在应用程序第一次请求变量时调用一次,然后只返回计算的结果?或者它是否像普通计算属性一样每次都被调用?我问的原因是因为我基本上想要Swift中的计算属性,它可以访问其他实例变量。假设我有一个名为“fullName”的变量,它只是连接firstName和lastName。我将如何在Sw

swift - 在 Swift 中重新初始化惰性初始化变量

我有一个初始化为的变量:lazyvaraClient:Clinet={var_aClient=Clinet(ClinetSession.shared())_aClient.delegate=selfreturn_aClient}()问题是,在某些时候,我需要重置此aClient变量,以便它可以在ClinetSession.shared()更改时再次初始化。但是,如果我将类设置为可选的Clinet?,当我尝试将其设置为nil时,LLVM会报错。如果我只是使用aClient=Clinet(ClinetSession.shared())在代码中的某处重置它,它将以EXEC_BAD_ACCES

c# - 正确实现的递归惰性迭代器函数将不会堆栈溢出吗?

tl;dr;在C#中,您是否可以确保仅调用自身且确实具有有效的递归退出条件的惰性迭代器函数不会导致堆栈溢出?详细问题:我知道,通常来讲,您无法保证由C#编译器(或JIT)生成的尾部调用优化(TCO)指令,因此尽管您可能会获得TCO,但不能保证。鉴于对TCO的这种认可,我想知道是否由于懒惰的迭代器函数(使用yieldreturn等)作为协程的性质-每个尾部调用是否甚至占用堆栈空间?由于协程的重新进入,我的直觉是默认情况下优化了每个尾部调用,因为从父级框架跳出函数并跳入下一个而不是创建新框架的能力似乎很自然。是C#中的这种行为,还是C#迭代器函数的递归调用从当前框架创建了一个新框架,而不是