Swift 为什么我的@lazy属性会崩溃,但如果我将其设置为非lazy,它会工作吗?

Swift 为什么我的@lazy属性会崩溃,但如果我将其设置为非lazy,它会工作吗?,swift,Swift,我对惰性属性有一个问题。我以为我拿到了,但也许我没有/也许是个虫子 我班上有一个懒惰的数组 @lazy var enteredRegions = Array<String>() 我有 self.enteredRegions.append(clRegion!.identifier); 当EXC\u访问错误时,会严重崩溃 现在,如果我删除@lazy: var enteredRegions = Array<String>() var enteredRegions

我对惰性属性有一个问题。我以为我拿到了,但也许我没有/也许是个虫子

我班上有一个懒惰的数组

@lazy var enteredRegions = Array<String>()
我有

 self.enteredRegions.append(clRegion!.identifier);
当EXC\u访问错误时,会严重崩溃

现在,如果我删除@lazy:

    var enteredRegions = Array<String>()
var enteredRegions=Array()
所有作品

所以。。这是怎么回事我的理解是,
self.enteredRegions
无论如何都会创建它


(我用一个UIWindow和一个CLLocationManager来实现这一点,它的工作原理与我所想的一样)

经过一些尝试,我发现了一些非常奇怪的事情

首先,如果我们将var封装在一个类中,它只会工作:

class RegionManager {
    @lazy var enteredRegions = Array<String>()
}
在此之后,我尝试更改为一些本机值,例如,
String
Int
等等,它们都失败了


所以,我猜这种奇怪的行为实际上是编译器本身的一个缺陷,它可能是源于对本机类型的一些优化,可能有一个内部池,或者苹果没有告诉我们什么。

@lazy
用于昂贵的操作,所以在调用属性之前它不会运行。创建数组并不是一项昂贵的操作,因此您无论如何都不需要@lazy。另外,从我所有的测试来看,@lazy仅适用于类。@AlexReynolds听起来似乎有道理,但它要么不被允许,要么不应该出现crashYes,但这可能是一个保留计数问题。因此,它可能是允许的,但由于保留计数没有增加,因此它被释放,因此访问不正确。这也不是@lazy属性的目的。阵列没有什么是昂贵的。由于内存管理和runtime@AlexReynolds这是懒惰的一个用途,是的,但也有其他用途。苹果的文档说明了多种用途:“如果属性的初始值依赖于外部因素,而外部因素的值在实例初始化完成后才知道,则惰性属性非常有用。当属性的初始值需要复杂的或计算代价高昂的设置时,惰性属性也很有用,除非或直到需要时才执行这些设置”。
class RegionManager {
    @lazy var enteredRegions = Array<String>()
}
regManager.enteredRegions.append("New!")
println("Regions: \(regManager.enteredRegions)") // Regions: [New!]