微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

懒惰让?结构中不合理的解决方法

我有一个我正在使用的不可变结构,我正在尝试创建一个不是计算值的属性,但是它的赋值需要先前分配的属性的值.

(哇满口).

我正在努力的属性是外围:Int

// Floor made out of square tiles.
struct Floor { 

  let
  size:           (x: Int,y: Int),// How many tiles in the floor
  tilePerimeter:  Int,// Calculate entire floor's perimeter based on tile quantity and perimeter:
  lazy let perimeter: Int = {

    let
    t4th  = self.tilePerimeter / 4,// Tile width / length
    sx    = self.size.x * t4th,// All X tiles' length
    sy    = self.size.y * t4th       // All Y tiles' width

    return (sx * 2) + (sy * 2)       // Perimeter calc
  }()
};

不幸的是,Swift不会让我使用懒惰的..所以我的解决方法是只用一个getter来制作一个计算的var …但如果这个计算需要很长时间(加载一个图像或复杂的数学)那么它会被叫很多次,真的只需要打一次

所以我的实际解决方法是创建一个初始化器并在那里分配周边…只有我的一些结构具有许多属性,而不是为结构创建初始化器是我喜欢的Swiftiness的一部分.

我知道我可以让它成为一个惰性var并将结构实例化为let,但这似乎令人困惑且容易出错.

有没有办法做到这一点,我可以保持不变性,性能和迅捷?而且,不允许使用懒惰的原因是什么原因?

解决方法

也许你毕竟可以使用lazy var:

lazy private(set) var perimeter: Int = {
    ...
}()

只读var使您更接近所需的let语义.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐