Swift文档说类,结构和枚举都可以符合协议,我可以达到一致的程度 . 但我无法让enum表现得像类和结构示例:
protocol ExampleProtocol {
var simpleDescription: String { get set }
mutating func adjust()
}
class SimpleClass: ExampleProtocol {
var simpleDescription: String = "A very simple class."
var anotherProperty: Int = 69105
func adjust() {
simpleDescription += " Now 100% adjusted."
}
}
var a = SimpleClass()
a.adjust()
let aDescription = a.simpleDescription
struct SimpleStructure: ExampleProtocol {
var simpleDescription: String = "A simple structure"
mutating func adjust() {
simpleDescription += " (adjusted)"
}
}
var b = SimpleStructure()
b.adjust()
let bDescription = b.simpleDescription
enum SimpleEnum: ExampleProtocol {
case Base
var simpleDescription: String {
get {
return "A Simple Enum"
}
set {
newValue
}
}
mutating func adjust() {
self.simpleDescription += ", adjusted"
}
}
var c = SimpleEnum.Base
c.adjust()
let cDescription = c.simpleDescription
我还没想出如何通过调用 adjust()
来改变 simpleDescription
. 我的例子显然不会这样做,因为getter的值是硬编码的,但是如何设置 simpleDescription
的值,同时仍然符合 ExampleProtocol
?
15 回答
这是我的尝试:
这是我的看法 .
由于这是一个
enum
而不是class
,你必须考虑不同的(TM):当你的enum
发生变化时,你的描述必须改变(正如@ hu-qiang指出的那样) .希望有所帮助 .
这是另一种方法,只使用从巡回赛获得的知识,直到那一点*
如果你想
adjust()
作为一个切换(虽然没有任何暗示是这种情况),使用:*(虽然它没有明确提到如何指定返回类型和协议)
这是一个不改变当前枚举值的解决方案,而是改变它们的实例值(以防它对任何人都有用) .
在枚举中没有getter和setter定义变量是不可能的,因此不可能有一个可以修改的变量 .
您可以符合协议,但不能像在类中一样进行变异 .
关于swift中的enum是一个link .
结构和枚举是值类型 . 默认情况下,无法在其实例方法中修改值类型的属性 . link
然后,你必须使用变异功能 .
另一种选择是adjust()在案例之间翻转,如下所示:
以杰克的答案为基础:
我想出了这个
这是我的代码
我的第一个贡献是:
谢谢别人!
由于之前的SimpleClass和SimpleStructure示例显示内部修改了simpleDescription属性,这个实验也让我失望了,这让我觉得我需要做同样的事情 . 在查看了此处发布的其他答案并阅读官方Apple Swift 2.1文档后,我想出了这个:
另请注意,在本实验之前,Apple为SimpleClass和SimpleStructure给出的示例中,简单描述在内部丢失 - 您无法获得原始值(除非您将其保存在类/结构之外);这就是促使我为SimpleEnum示例创建一个restore()方法的原因,它允许您在值之间来回切换它 . 希望这对某人有用!
我认为目标只是保留状态并使用描述来使当前状态更容易阅读:
Another variation: Using associated values to hold and display previous option (格式为"Selected 1, adjusted from 2, adjusted from 1, adjusted from 2, adjusted from 1")
这个怎么样