swift4 - 实现 CaseIterable Swift 4 的字符串枚举扩展
问题描述
从 swift 4 开始,枚举中的协议 CaseIterable 让我的生活更快乐,但我想知道我是否可以为枚举类型创建扩展:字符串,CaseIterable。
到目前为止,我可以像这样创建一个枚举字符串扩展:
extension RawRepresentable where RawValue == String{
func toCorrectFormatSring()->String{
var returnedString = self.rawValue
returnedString = returnedString.uppercased()
return returnedString
}
}
但是我有一些具有共同功能的枚举,我不想在所有枚举中重复它。该函数以逗号分隔的字符串给出所有情况,它看起来像这样:
enum Vehicle:String,CaseIterable{
case car
case truck
static func getStringList()->String{
let aArray = self.allCases
var returnedString = ""
for aItem in aArray{
returnedString += "\(aItem.toCorrectFormatSring())\(aItem == aArray.last ? "":",")"
}
return returnedString
}
}
我想通过扩展使用的功能是getStringList。可能吗?
输出
[CAR,TRUCK]
解决方案
你可能想要这样的东西:
extension RawRepresentable where RawValue == String {
func toCorrectFormat() -> String {
let returnedString = // whatever
return returnedString
}
}
extension CaseIterable where Self : RawRepresentable, Self.RawValue == String {
static func getStringList() -> String {
let aArray = Array(self.allCases)
var returnedString = ""
if let last = aArray.last {
for aItem in aArray{
returnedString += "\(aItem.toCorrectFormat())\(aItem == last ? "" : ",")"
}
}
return returnedString
}
}
现在你可以开始了,因为协议扩展将所需的静态函数注入到枚举中:
enum E : String, CaseIterable {
case howdy
case byebye
}
let s = E.getStringList()
现在您知道如何注入所需的功能,您可以getStringList
用更好的方式重写(循环很傻,与的比较last
是错误的,字符串插值是不必要的)。我认为你真正追求的是这样的:
extension CaseIterable where Self : RawRepresentable, Self.RawValue == String {
static func getStringList() -> String {
return Array(self.allCases)
.map{$0.rawValue.uppercased()}
.joined(separator:",")
}
}
推荐阅读
- python - 替代全局变量
- python - Python discord self bot 不会删除直接消息中的消息
- javascript - 我应该如何创建一个将 {{trigger.message.From}} 更改为名称的函数?
- css - Blogger 中的 srcset 和特定图像大小
- bluetooth - 跨平台蓝牙开发解决方案
- javascript - 根据 GroupedList json 格式转换 Json 和组 json - React Native
- c++ - 如何在 rust cdylib 中定义 DllMain 函数?
- c - 如何使用堆栈和队列以非递归方式查找集合的所有可能子集
- javascript - 执行 UI 块时抛出异常 - 仅在手机上运行时出现错误
- c++ - 检查二维向量的元素是否为 NULL