在Swift中,如果编写了var,是否调用了惰性实例化器?
以下是我翻译成Swift的Objective-C代码:在Swift中,如果编写了var,是否调用了惰性实例化器?,swift,Swift,以下是我翻译成Swift的Objective-C代码: @implementation Audio @synthesize fileCode = _fileCode; - (NSString *)fileCode { if (!_fileCode) _fileCode = [[NSUUID UUID] UUIDString]; return _fileCode; } ... 以下是翻译的开始: class Audio: NSObject { var
@implementation Audio
@synthesize fileCode = _fileCode;
- (NSString *)fileCode
{
if (!_fileCode)
_fileCode = [[NSUUID UUID] UUIDString];
return _fileCode;
}
...
以下是翻译的开始:
class Audio: NSObject {
var fileID: Int?
lazy var fileCode = {
return NSUUID.UUID().UUIDString;
}
...
假设UUID计算是不必要的昂贵,我希望在必要时避免它
在Objective-C用例中:
Audio bob = [[Audio alloc] init];
bob.fileCode = "CODE";
不会导致调用惰性初始值设定项,因为getter会跳过它
对于Swift,我也能保证这一点吗?这正是懒惰的定义,来自: 惰性存储属性是一种直到第一次使用它时才计算其初始值的属性
我在Swift 2.1.1中做了一个测试,如果您在获取属性之前设置了属性,那么惰性初始值设定项根本就不会被调用(这很有意义)。我的测试代码如下
var lazyInitializerCalled = false
func getFileCode() -> String {
lazyInitializerCalled = true
return "I'm lazy"
}
class Audio {
lazy var fileCode = getFileCode()
init() { }
}
var myClass = Audio()
myClass.fileCode = "I'm not lazy" // comment this out to use the lazy initializer
print(myClass.fileCode)
if !lazyInitializerCalled {
print("We skipped the lazy initializer!")
} else {
print("We called the lazy initializer!")
}
您是否尝试通过设置断点或在方法中添加print语句来测试此问题?另外,您的属性初始化应该是
lazy var fileCode=nsuid().uuistring
Swift不使用工厂方法,您也不想使属性成为闭包。如果您试图通过从另一个位置指定默认值来绕过惰性初始化器,为什么不直接声明“正常”属性?我想澄清的是,为该属性指定新值是否算作“使用”它。