我是Swift的新手,刚刚在文档中遇到过这个问题:
计算属性由类,结构和提供 枚举。存储的属性仅由类和提供 结构。
为什么?枚举的关联值是否与存储属性一样?看起来他们最初存储了属性 - Why no stored type properties for classes in swift?
答案 0 :(得分:14)
enum
确实存储了类型属性 - 即static
属性。他们没有存储实例属性。我不知道为什么存储的实例属性不适用于enum
的技术原因。你可能不得不在开发论坛上提出你的问题,如果你想要一个技术答案,为什么"。
在您的问题中,您询问关联值是否与存储属性相同。事实上,它们确实比struct
和class
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))