Найти имя, которое было связано со значением OptionSet - PullRequest
0 голосов
/ 11 мая 2018

Итак, у меня есть OptionSet:

struct Ability: OptionSet {
    let rawValue: Int

    static let create  = Ability(rawValue: 1 << 0)
    static let read    = Ability(rawValue: 1 << 1)
    static let update  = Ability(rawValue: 1 << 2)
    static let delete  = Ability(rawValue: 1 << 3)

    init(rawValue: Int) {
        self.rawValue = rawValue
    }
}

Я просто пишу один в качестве примера здесь. На самом деле мой код не знает, что именно он имеет OptionSet, он знает только, что получает OptionSet. То, что я хочу сделать, это иметь возможность получить имя опции из rawValue как String.

Итак, я хочу написать функцию со следующей сигнатурой:

func convertOptionToString<OS: OptionSet>(optionSet: OS) -> String

Где convertOptionToString(Ability.read) вернется "read"

Конечно, я знаю, что OptionSet s также может содержать несколько значений, но я уже знаю, как мне поступить в такой ситуации, поэтому мне не нужна помощь.

Я надеюсь, что эту проблему можно решить с помощью какого-то умного Отражения, но я пока не смог выяснить, как это сделать. Кто-нибудь хочет попробовать?

1 Ответ

0 голосов
/ 11 мая 2018

Обновите struct, чтобы он соответствовал CustomStringConvertible, и добавьте свойство description:

struct Ability: OptionSet, CustomStringConvertible {
    let rawValue: Int

    static let create  = Ability(rawValue: 1 << 0)
    static let read    = Ability(rawValue: 1 << 1)
    static let update  = Ability(rawValue: 1 << 2)
    static let delete  = Ability(rawValue: 1 << 3)

    init(rawValue: Int) {
        self.rawValue = rawValue
    }

    var description: String {
        var vals = [String]()
        if self.contains(.create) {
            vals.append("create")
        }
        if self.contains(.read) {
            vals.append("read")
        }
        if self.contains(.update) {
            vals.append("update")
        }
        if self.contains(.delete) {
            vals.append("delete")
        }

        return vals.joined(separator: ",")
    }
}

print(Ability.read)
let opts: Ability = [ .read, .delete ]
print(opts)

Выход:

прочитать
читать, удалять

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...