【问题标题】:lazy attribute in Swift equivalent to lazy Init getter in Objective CSwift 中的惰性属性相当于 Objective C 中的惰性 Init getter
【发布时间】:2014-06-03 19:46:04
【问题描述】:

Swift 中的惰性属性是否等同于在 Objective C 中使用惰性加载模式覆盖 getter?

【问题讨论】:

    标签: ios objective-c swift lazy-evaluation


    【解决方案1】:

    来自文档:

    惰性存储属性是在第一次使用时才计算初始值的属性。您可以通过在声明之前编写惰性属性来指示惰性存储属性。

    所以,大多数情况下,是的。

    您必须始终将惰性属性声明为变量(使用 var 关键字),因为在实例初始化完成之前可能无法检索其初始值。常量属性在初始化完成之前必须始终有一个值,因此不能声明为惰性。”

    请记住,在 Swift 上,您可以选择为您的属性声明自定义 getter 和 setter:

    var name : String?{
      get{
        return "Oscar"
      }
      set(newValue){
    
      }
    }
    

    【讨论】:

    • 谢谢。与使用 @Lazy 属性相比,在 Swift 的自定义 getter 中(如果可能)声明惰性模式有什么好处吗?
    • 在这 24 小时的测试中我没有看到。不过,这可能会改变。
    • 感谢您的快速回复。
    • 我的荣幸。你总是可以选择正确的答案:-)
    【解决方案2】:

    参考这个:

    lazy var x = SomeFunction()
    

    Objective-C 中最接近的等价物是这样的:

    @property BOOL xHasBeenSet;
    @property id x;
    
    - (id)x
    {
        if (!self.xHasBeenSet) {
            self.x = SomeFunction();
        }
        return x;
    }
    
    - (void)setX:(id)x
    {
        _x = x;
        self.xHasBeenSet = YES;
    }
    

    在这里,您只会在第一次读取x 时看到调用SomeFunction,但前提是您没有先设置x。需要注意的是,只有一个代码路径可以调用右侧,并且它永远不会重置回 xHasBeenSet = NO

    【讨论】:

    • ???那将是....奇怪。两个属性使一个懒惰?就做- (id)x { if(!_x) _x = someFunction()
    • @Daij-Djan 对于 SomeFunction() 可以返回 0 或 nil 的情况,RHS 仍然只会被调用一次。
    • 好的 -- 然后使用 dispatch_once - (id)x { dispatch_once(^{ if(!_x) _x = boa; }); return _x; } [我省略了令牌,因为我总是语法错误:D]
    • self.x = ... 因为设置翻转了两个变量而变得懒惰。
    • @Daij-Djan 这错过了有人在调用之前设置x = 0 的情况。这是一件棘手的事情。但是,是的,可能还涉及线程安全的锁。
    【解决方案3】:

    主要是——虽然它不能是计算属性

    【讨论】:

      猜你喜欢
      • 2015-05-15
      • 2017-10-29
      • 2014-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-18
      • 2017-11-04
      • 1970-01-01
      相关资源
      最近更新 更多