close
建立類似Windows Phone的雙向綁定型態轉換器(IValueConverter),
並搭配extension來實現預設實作,再建DateToStringConverter。
在使用的時候,
TextField("test", text: $enterDate.convert(converter: dateToStringConverter), prompt: Text("請輸入"))
extension Binding {
func convert(converter: T) -> Binding where T: IValueConverter,
Value == T.Source {
return Binding {
return converter.convert(value: self.wrappedValue)
} set: { (value: T.Target) in
do {
self.wrappedValue = try converter.convertBack(value: value)
} catch {
print(String(describing: error))
}
}
}
}
protocol IValueConverter {
associatedtype Source
associatedtype Target
associatedtype Parameter
var parameter: Parameter { get }
func convert(value: Source) -> Target
func convertBack(value: Target) throws -> Source
}
struct DateToStringConverter: IValueConverter {
typealias Source = Date?
typealias Target = String
typealias Parameter = String
let parameter: Parameter
init(parameter: Parameter) {
self.parameter = parameter
}
func convert(value: Source) -> Target {
return value?.toString(format: parameter) ?? ""
}
func convertBack(value: Target) throws -> Source {
guard let value = value.toDate(format: parameter) else {
throw NSError(domain: "Can't cast from \(Source.self) to \(Target.self)", code: -1)
}
return value
}
}
全站熱搜
留言列表