Строковый инициализатор для необязательных примитивных типов: Int? Удвоить? Поплавок? так далее - PullRequest
0 голосов
/ 16 мая 2018

Возможно ли иметь расширение для всех вышеперечисленных типов без указания каждого типа отдельно?

Например, вот такое расширение для Double:

extension String {
  init?(_ value: Double?) {
    if let nonOpt = value {
      self.init(nonOpt)
    } else {
      return nil
    }
  }
}


let nonOpt: Double = 1

let opt: Double? = 1

let string = String(opt)

print(string)

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

Ответы [ 2 ]

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

Вы имеете в виду что-то вроде этого

extension String {
    init?<T : CustomStringConvertible>(_ value : T?) {
        guard let value = value else { return nil }
        self.init(describing: value)
    }
}

или

extension String {
    init?<T : LosslessStringConvertible>(_ value : T?) {
        guard let value = value else { return nil }
        self.init(value)
    }
}
0 голосов
/ 16 мая 2018

Вместо того, чтобы объявлять пользовательский инициализатор, просто используйте map, чтобы отобразить значение в String как таковое:

let optDouble: Double? = nil
let optionalDoubleString = opt.map { String($0) }
let optInt: Int? = nil
let optionalIntString = opt.map { String($0) }
...