实现 CaseIterable Swift 4 的 String 枚举扩展

Extension for String enum implementing CaseIterable Swift 4

来自 swift 4 枚举中的 CaseIterable 协议让我的生活更快乐,但我想知道我是否可以为枚举创建扩展 Type:String,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{[=12=].rawValue.uppercased()}
            .joined(separator:",")
    }
}