为什么枚举在Swift中有计算属性而不是存储属性?

时间:2015-08-28 19:14:46

标签: swift enums language-features

我是Swift的新手,刚刚在文档中遇到过这个问题:

  

计算属性由类,结构和提供   枚举。存储的属性仅由类和提供   结构。

为什么?枚举的关联值是否与存储属性一样?看起来他们最初存储了属性 - Why no stored type properties for classes in swift?

3 个答案:

答案 0 :(得分:14)

enum确实存储了类型属性 - 即static属性。他们没有存储实例属性。我不知道为什么存储的实例属性不适用于enum的技术原因。你可能不得不在开发论坛上提出你的问题,如果你想要一个技术答案,为什么"。

在您的问题中,您询问关联值是否与存储属性相同。事实上,它们确实比structclass es的存储属性更灵活(在某些方面)。 case中的每个enum都可以拥有与之关联的专用数据集。您可以个性化每个case的存储属性,而不是拥有一组适用于所有case的存储属性。

答案 1 :(得分:4)

我使用一个小技巧来存储初始化时无法访问的属性。

首先,我创建了一个类Future,它将在未来存储所存储的属性:

class Future<T> {
  var value: T?
  init(value: T? = nil) {
      self.value = value
  }
}

然后我创建了我的枚举:

enum Sample {
  case Test(future: Future<String>)
}

实例化:

let enumTest = Sample.Test(future: Future())

后面的代码:

switch enumTest {
  case let .Test(future):
  future.value = "Foo"
}

稍后,您可以访问以下值:

switch enumTest {
  case let .Test(future):
  // it will print Optional("Foo")
  print("\(future.value)")
}

这不是你应该滥用的东西,但在某些情况下它可能会有所帮助。

希望它有所帮助。

答案 2 :(得分:0)

枚举被视为一种结构化数据类型,可以修改而无需在代码中多次更改说出一个String或Int,并且使用枚举我们永远不必担心多次更改同一个内容。例如下拉菜单:

enum DropDownMenuOptions: String {
  case MenuOptionOne
  case MenuOptionTwo
  case MenuOptionThree
}

使用存储的属性,您可以预先计算所需信息并减少主函数中的代码。最好的例子是计算rect的大小,例如:

struct Point {
    var x = 0.0, y = 0.0
}
struct Size {
    var width = 0.0, height = 0.0
}
struct Rect {
    var origin = Point()
    var size = Size()
    var center: Point {
        get {
            let centerX = origin.x + (size.width / 2)
            let centerY = origin.y + (size.height / 2)
            return Point(x: centerX, y: centerY)
        }
        set(newCenter) {
            origin.x = newCenter.x - (size.width / 2)
            origin.y = newCenter.y - (size.height / 2)
        }
    }
}

var square = Rect(origin: Point(x: 0.0, y: 0.0),
    size: Size(width: 10.0, height: 10.0))