Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.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
Ios 延迟加载可选属性,以后可能为零_Ios_Swift - Fatal编程技术网

Ios 延迟加载可选属性,以后可能为零

Ios 延迟加载可选属性,以后可能为零,ios,swift,Ios,Swift,在Objective-C中,使用lazy init,我可以将任何@property设置为nil,当我调用它的getter时,它将被重新创建 但是,在Swift中,使用lazy修饰符,它不起作用。 使用以下代码对其进行了测试: class SomeClass { lazy var optionalVar: String? = { return "abc" }() func checkVar() { println(optionalVar!)

在Objective-C中,使用lazy init,我可以将任何
@property
设置为
nil
,当我调用它的
getter
时,它将被重新创建

但是,在Swift中,使用
lazy
修饰符,它不起作用。
使用以下代码对其进行了测试:

class SomeClass {
    lazy var optionalVar: String? = {
        return "abc"
    }()

    func checkVar() {
        println(optionalVar!)
    }
}

let instance = SomeClass()
instance.checkVar()
//instance.variable = nil
instance.checkVar()
变量
设置为
nil
时,它将不会重新初始化。因此,下一行代码将触发运行时错误

如何使我的Swift代码与Objective-C中的一样工作
谢谢

----------------
编辑:添加更多代码

class SomeClass {
    var optionalVar: String?

    func checkVar() {
        println(optionalVar!)
    }

    func createVar() -> String {
        if let tempVar = optionalVar {
            return tempVar
        } else {
            println("create optional")
            return "123"
        }
    }
}

let instance = SomeClass()
instance.optionalVar = instance.createVar()
instance.checkVar()
instance.optionalVar = nil
instance.optionalVar = instance.createVar()
instance.checkVar()

除了中已经提出的解决方案外,我可以提出的最优雅的替代解决方案是在属性设置为nil时拦截,并使用默认值覆盖赋值:

class SomeClass {
    private var _optionalVar: String?

    var nonoptionalVar: String? {
        get { return _optionalVar }
        set { _optionalVar = newValue == nil ? "123" : newValue }
    }

    init() {
        self.nonoptionalVar = nil
    }
}

不过也有一个缺点:您必须记住在初始值设定项中将属性显式设置为nil(否则属性将保留其默认初始值,即
nil

可能重复是的,我确实读过这个问题,还有其他一些相同主题的问题。基本上,这些问题的答案都是模仿objective-C解决方案。我正在寻找一个更优雅的解决方案。不幸的是,lazy只适用于一次性初始化。使用我的
惰性
类(其代码在链接问题中)怎么样?这是一个很好的解决方案,真的。但是,我想先熟悉这门语言,所以我会用传统的方法。我想为每个
var
创建许多
方法。然后,我将调用var的“init方法”,而不是将它们设置为
nil
,您认为呢?好吗?你能给我举个例子吗?