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
    }
}

arrow
arrow
    全站熱搜

    小賢 發表在 痞客邦 留言(0) 人氣()