这是一个与Swift相关的UML问题。这不是Swift编程问题
Swift提供了一个enum type,它可以完全像UML中的枚举:它有一个值语义,定义了一组文字,并且可能有操作。唯一的区别是它不能有属性(甚至不像Java中的常量)。
但是Swift也提供了具有关联值的枚举。示例:
enum Beverage {
case water
case juice(String)
case tea(flavor: String)
case coffee (strength: Int)
case other
}
let b1 = Beverage.water
let b2 = Beverage.juice("Apple")
let b3 = Beverage.tea(flavor: "mint")
let b4 : Beverage = .coffee(strength: 3)
关联的值在示例初始化时提供,并且不能直接访问,只能使用模式匹配来检索,即在switch语句中,
case .tea:
我们可以用途:
case let .tea(taste): // if the case branch is fired, taste contains the value
使用简单的枚举并忽略关联的值是很有诱惑力的:
然而,考虑到UML规范,这并没有捕捉到swift枚举的真实的本质:
EnumerationLiteral定义Enumeration的运行时扩展的元素。对应于EnumerationLiterals的值是不可变的,并且可以比较相等。EnumerationLiterals在其存在期间可能不会更改,因此Enumeration上的任何属性都应为只读。
最后一句对应于Java enum的情况,您可以将一组常量属性与特定的枚举文字相关联。它并不完全适用于swift的关联值,其中关联值可以根据文字而变化,而且同一文字可能关联到不同的值。
如何在UML中对这种枚举进行最佳建模?
2条答案
按热度按时间fwzugrvs1#
我将其建模为一组专门针对
Beverage
的数据类型:Swift可能会添加一些语法糖,但本质上这就是它的结果。至少就我对swift枚举的有限理解而言是这样。
qhhrdooz2#
我承认我有点困惑。根据规范,
«enumeration»
由EnumerationLiteral
组成,它们是InstanceSpecification
的特殊化。所以应该可以添加每个文字的类型。注意:我尝试用Enterprise Architect对此进行建模,但它只显示了文字的名称。他们的(Sparx)文档也说它只允许唯一的名称。他们只引用了带有 enumeration literals 的UML段落。
但是,也可以将其构造为另一个
«datatype»
,从而允许具有唯一的类型化属性。您可以创建一个概要文件和原型,比如«typed-enum»
或类似的。UML«enumeration»
也是«datatype»
的特殊化。所以它们可以一起生活。