Skip to content

Instantly share code, notes, and snippets.

@gonzalezreal
Last active February 8, 2017 16:22

Revisions

  1. gonzalezreal revised this gist Apr 8, 2015. 1 changed file with 3 additions and 3 deletions.
    6 changes: 3 additions & 3 deletions ValueTransformer.swift
    Original file line number Diff line number Diff line change
    @@ -50,7 +50,7 @@ public extension NSValueTransformer {
    */
    class func setValueTransformerWithName<T, U>(name: String, transform: (T) -> (U?)) {
    let transformer = ValueTransformer { value in
    return flatMap(value as? T) {
    return (value as? T).flatMap {
    transform($0) as? AnyObject
    }
    }
    @@ -67,11 +67,11 @@ public extension NSValueTransformer {
    */
    class func setValueTransformerWithName<T, U>(name: String, transform: (T) -> (U?), reverseTransform: (U) -> (T?)) {
    let transformer = ReversibleValueTransformer(transform: { value in
    return flatMap(value as? T) {
    return (value as? T).flatMap {
    transform($0) as? AnyObject
    }
    }, reverseTransform: { value in
    return flatMap(value as? U) {
    return (value as? U).flatMap {
    reverseTransform($0) as? AnyObject
    }
    })
  2. gonzalezreal created this gist Apr 7, 2015.
    81 changes: 81 additions & 0 deletions ValueTransformer.swift
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,81 @@
    import Foundation

    private class ValueTransformer: NSValueTransformer {
    let transform: (AnyObject?) -> (AnyObject?)

    init(transform: (AnyObject?) -> (AnyObject?)) {
    self.transform = transform
    }

    // MARK: NSValueTransformer

    override class func allowsReverseTransformation() -> Bool {
    return false;
    }

    override class func transformedValueClass() -> AnyClass {
    return NSObject.self
    }

    override func transformedValue(value: AnyObject?) -> AnyObject? {
    return transform(value)
    }
    }

    private class ReversibleValueTransformer: ValueTransformer {
    let reverseTransform: (AnyObject?) -> (AnyObject?)

    init(transform: (AnyObject?) -> (AnyObject?), reverseTransform: (AnyObject?) -> (AnyObject?)) {
    self.reverseTransform = reverseTransform
    super.init(transform: transform)
    }

    // MARK: NSValueTransformer

    override class func allowsReverseTransformation() -> Bool {
    return true;
    }

    override func reverseTransformedValue(value: AnyObject?) -> AnyObject? {
    return reverseTransform(value)
    }
    }

    public extension NSValueTransformer {
    /**
    Registers a value transformer with a given name and transform function.

    :param: name The name of the transformer.
    :param: transform The function that performs the transformation.
    */
    class func setValueTransformerWithName<T, U>(name: String, transform: (T) -> (U?)) {
    let transformer = ValueTransformer { value in
    return flatMap(value as? T) {
    transform($0) as? AnyObject
    }
    }

    self.setValueTransformer(transformer, forName: name)
    }

    /**
    Registers a reversible value transformer with a given name and transform functions.

    :param: name The name of the transformer.
    :param: transform The function that performs the forward transformation.
    :param: reverseTransform The function that performs the reverse transformation.
    */
    class func setValueTransformerWithName<T, U>(name: String, transform: (T) -> (U?), reverseTransform: (U) -> (T?)) {
    let transformer = ReversibleValueTransformer(transform: { value in
    return flatMap(value as? T) {
    transform($0) as? AnyObject
    }
    }, reverseTransform: { value in
    return flatMap(value as? U) {
    reverseTransform($0) as? AnyObject
    }
    })

    self.setValueTransformer(transformer, forName: name)
    }
    }
    9 changes: 9 additions & 0 deletions usage.swift
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,9 @@
    func stringToInt(value: String) -> Int? {
    return value.toInt()
    }

    func intToString(value: Int) -> String? {
    return "\(value)"
    }

    NSValueTransformer.setValueTransformerWithName("StringToInt", transform: stringToInt, reverseTransform: intToString)