首页 > 解决方案 > 实现 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]

标签: swift4swift4.1swift4.2

解决方案


你可能想要这样的东西:

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

推荐阅读