есть ли у кого-нибудь (лучший) способ сделать это?
Допустим, у меня есть дополнительный поплавок
let f: Float? = 2
Теперь я хочу преобразовать его в Double
let d = Double(f) //fail
Очевидно, это не удастся, но есть ли способ связать необязательное через функцию, как вы можете с вычисляемыми переменными? Сейчас я делаю вот что:
extension Float {
var double: Double { return Double(self) }
}
let d: Double? = f?.double
Но мне очень не нравится ставить приведение в качестве вычисляемой переменной.
Другой вариант, который я рассмотрел, заключается в следующем:
public func optionalize<A,B>(_ λ : @escaping (A) -> B) -> (A?) -> B? {
return { (a) in
guard let a = a else { return nil }
return λ(a)
}
}
let d: Double? = optionalize(Double.init)(f)
Я понимаю, что могу сохранить значение «f», чтобы его развернуть. Однако во многих случаях необязательное значение будет параметром функции, возвращающей необязательный. Это приводит к промежуточным значениям в гвардии. Как видно из этого примера:
func foo(_ a: String?) throws -> Float {
guard
let a = a,
let intermediate = Float(a)
else { throw.something }
return intermediate
}
Здесь также возможно сбой преобразования String в Float. По крайней мере, с вычисляемой переменной эта функция foo немного чище
extension String {
var float: Float? { return Float(self) }
}
func foo(_ a: String?) throws -> Float {
guard
let a = a?.float
else { throw.something }
return a
}
Я не хочу переписывать необязательные версии частых инициалов.
Будем очень признательны за любые идеи. Спасибо!