Расширение для перечисления String, реализующего CaseIterable Swift 4 - PullRequest
0 голосов
/ 17 октября 2018

С swift 4 протокол CaseIterable в перечислениях сделал мою жизнь счастливее, но я хотел бы знать, могу ли я создать расширение для перечисления. Тип: 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 .Возможно ли это?

OUPUT

[CAR,TRUCK]

1 Ответ

0 голосов
/ 17 октября 2018

Вы, вероятно, хотите что-то вроде этого:

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