Swift протокол для вещей, которые конвертируют в и из String - PullRequest
0 голосов
/ 07 ноября 2019

Я хотел бы иметь GenericThing с параметром шаблона любого типа, который может быть разумно преобразован в строку и из нее.

// ConvertsToAndFromString is a made up protocol here – what should I use instead?
struct GenericThing<Id: ConvertsToAndFromString> {
}

Затем я смогу использовать GenericThing с любым типом, который имеет разумную кодировку в виде строки. Например, он должен работать для Int, String (ну, да) и, в идеале, для любого RawRepresentable, где сам RawValue будет преобразовывать в строку и из нее.

Пример:

enum Tubbies: String {
  case dipsy
  case laalaa
  case po
}

// I'd like to be able to do this.
let genericThing = GenericThing<Tubbies>

Я не понимаю, как легко это сделать.

Я надеялся, что смогу использовать LosslessStringConvertible вместо своего выдуманного ConvertsToAndFromString.

Я пробовал это, и оно работает для Int и тому подобное. Но это не работает для Tubbies. Я не мог найти способ заставить все RawRepresentable, где RawValue: LosslessStringConvertible также соответствовать LosslessStringConvertible.

1 Ответ

1 голос
/ 07 ноября 2019

Вот как вы расширяете RawRespresentable до условного LosslessStringConvertible в зависимости от его RawValue:

extension RawRepresentable where RawValue: LosslessStringConvertible {
    init?(_ rv: RawValue) {
        self.init(rawValue: rv)
    }

    var description: String { return self.rawValue.description }
}

Вот оно в действии:

struct GenericThing<Id: LosslessStringConvertible> {

}

enum Tubbies: String, LosslessStringConvertible {
    case dipsy
    case laalaa
    case po
}

let genericThing = GenericThing<Tubbies>()
print(Tubbies.po is LosslessStringConvertible) // => true
...