我想用用于访问数据库中列的键的嵌套枚举替换我的全局字符串常量。
结构如下:
enum DatabaseKeys {
enum User: String {
case Table = "User"
case Username = "username"
...
}
...
}
数据库中的每个表都是一个内部枚举,表的名称是枚举的标题。每个枚举中的第一个案例将是表的名称,后面的案例是其表中的列。
要使用这个,它很简单:
myUser[DatabaseKeys.User.Username.rawValue] = "Johnny"
但是我会经常使用这些枚举。必须将. rawValue
附加到每个实例将是一种痛苦,并且它的可读性不如我希望的那样。如何在不使用rawValue
的情况下访问String值?如果我能做到这一点,那就太好了:
myUser[DatabaseKeys.User.Username] = "Johnny"
请注意,我正在使用Swift 2。如果有更好的方法来实现这一点,我很乐意听听!
虽然我没有找到使用所需的枚举语法来做到这一点的方法,但使用结构是可能的。
struct DatabaseKeys {
struct User {
static let identifier = "User"
static let Username = "username"
}
}
使用:
myUser[DatabaseKeys.User.Username] = "Johnny"
Apple在WatchKit模板中为故事板和行类型标识符使用类似的结构。
您可以为此使用CustomStringConver可转换协议。
从留档,
String(实例)适用于任何类型的实例,如果实例碰巧是CustomStringConver可转换的,则返回其描述。因此,不鼓励使用CustomStringConver可转换作为泛型约束,或直接访问符合条件的类型的描述。
因此,如果您符合此协议并通过描述方法返回您的rawValue,您将能够使用String(Table. User)来获取值。
enum User: String, CustomStringConvertible {
case Table = "User"
case Username = "username"
var description: String {
return self.rawValue
}
}
var myUser = [String: String]()
myUser[String(DatabaseKeys.User.Username)] = "Johnny"
print(myUser) // ["username": "Johnny"]
您可以在符合String的枚举上使用callAsFunction(Swift 5.2中的新功能)。
enum KeychainKey: String {
case userId
case email
}
func callAsFunction() -> String {
return self.rawValue
}
用法:
KeychainKey.userId()