实现CaseIterable Swift 4的String枚举扩展

时间:2018-10-17 14:35:22

标签: swift4 swift4.1 swift4.2

从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]

1 个答案:

答案 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:",")
    }
}