UML类图中带有关联值的Swift枚举

ryhaxcpt  于 2023-05-05  发布在  Swift
关注(0)|答案(2)|浏览(160)

这是一个与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中对这种枚举进行最佳建模?

fwzugrvs

fwzugrvs1#

我将其建模为一组专门针对Beverage的数据类型:

Swift可能会添加一些语法糖,但本质上这就是它的结果。至少就我对swift枚举的有限理解而言是这样。

qhhrdooz

qhhrdooz2#

我承认我有点困惑。根据规范,«enumeration»EnumerationLiteral组成,它们是InstanceSpecification的特殊化。所以应该可以添加每个文字的类型。
注意:我尝试用Enterprise Architect对此进行建模,但它只显示了文字的名称。他们的(Sparx)文档也说它只允许唯一的名称。他们只引用了带有 enumeration literals 的UML段落。
但是,也可以将其构造为另一个«datatype»,从而允许具有唯一的类型化属性。您可以创建一个概要文件和原型,比如«typed-enum»或类似的。UML «enumeration»也是«datatype»的特殊化。所以它们可以一起生活。

相关问题