从Swift 4开始,枚举中的CaseIterable协议使我的生活更加幸福,但是我想知道是否可以为Type:String,CaseIterable枚举创建扩展。
到目前为止,我可以创建一个枚举String扩展:
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]
答案 0 :(得分:1)
您可能想要这样的东西:
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:",")
}
}