使用 Xcode 7.3.1 和 Swift 2.2
虽然我同意 Martin R 的观点,并且 Ray Wenderlich 风格指南提出了一个很好的观点,即枚举在几乎所有用例中都更好,因为它是一个纯命名空间,但有一个地方使用 struct 胜过 @987654322 @。
切换语句
让我们从结构版本开始:
struct StaticVars {
static let someString = "someString"
}
switch "someString" {
case StaticVars.someString: print("Matched StaticVars.someString")
default: print("Didn't match StaticVars.someString")
}
使用结构,这将匹配并打印出Matched StaticVars.someString。
现在让我们考虑无大小写枚举版本(只需将关键字 struct 更改为 enum):
enum StaticVars {
static let someString = "someString"
}
switch "someString" {
case StaticVars.someString: print("Matched StaticVars.someString")
default: print("Didn't match StaticVars.someString")
}
您会注意到在case StaticVars.someString: 行的switch 语句中出现编译时错误。错误是Enum case 'someString' not found in type 'String'。
有一个伪解决方法,将静态属性转换为返回类型的闭包。
所以你可以这样改变它:
enum StaticVars {
static let someString = { return "someString" }
}
switch "someString" {
case StaticVars.someString(): print("Matched StaticVars.someString")
default: print("Didn't match StaticVars.someString")
}
注意 case 语句中需要括号,因为它现在是一个函数。
缺点是现在我们已经把它变成了一个函数,每次调用它都会被执行。因此,如果它只是一个简单的原始类型,如String 或Int,这还不错。它本质上是一个计算属性。如果它是一个需要计算的常量并且您只想计算一次,请考虑将其计算到不同的属性中并在闭包中返回已经计算的值。
您还可以使用私有初始化器覆盖默认初始化器,然后您将获得与无大小写枚举相同的编译时错误优点。
struct StaticVars {
static let someString = "someString"
private init() {}
}
但是有了这个,你想把结构的声明放在它自己的文件中,因为如果你在同一个文件中声明它,比如说,一个 View Controller 类,那个类的文件仍然可以不小心实例化一个无用的StaticVars 实例,但在类文件之外它会按预期工作。但这是你的决定。