Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Swift中,如果编写了var,是否调用了惰性实例化器?_Swift - Fatal编程技术网

在Swift中,如果编写了var,是否调用了惰性实例化器?

在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

以下是我翻译成Swift的Objective-C代码:

@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不使用工厂方法,您也不想使属性成为闭包。如果您试图通过从另一个位置指定默认值来绕过惰性初始化器,为什么不直接声明“正常”属性?我想澄清的是,为该属性指定新值是否算作“使用”它。