Skip to content

Commit

Permalink
Merge pull request #27 from isair/feature/single-operator
Browse files Browse the repository at this point in the history
Switch to a single operator
  • Loading branch information
Baris Sencan committed Apr 4, 2015
2 parents 84c815a + 23d4bce commit a54e380
Show file tree
Hide file tree
Showing 6 changed files with 102 additions and 118 deletions.
2 changes: 1 addition & 1 deletion JSONHelper.podspec
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
Pod::Spec.new do |s|
s.name = 'JSONHelper'
s.version = '1.4.2'
s.version = '1.5.0'
s.license = { :type => 'zlib', :file => 'LICENSE' }
s.summary = 'Lightning fast JSON deserialization and value conversion library for iOS & OS X written in Swift.'

Expand Down
111 changes: 52 additions & 59 deletions JSONHelper/JSONHelper.swift
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,13 @@ import Foundation
/// type of object as a value.
public typealias JSONDictionary = [String: AnyObject]

// MARK: Operator for quick primitive type deserialization.
/// Operator for use in deserialization operations.
infix operator <-- { associativity right precedence 150 }

infix operator <<< { associativity right precedence 150 }
/// MARK: Primitive Type Deserialization

// For optionals.
public func <<< <T>(inout property: T?, value: AnyObject?) -> T? {
public func <-- <T>(inout property: T?, value: AnyObject?) -> T? {
var newValue: T?
if let unwrappedValue: AnyObject = value {
// We unwrapped the given value successfully, try to convert.
Expand Down Expand Up @@ -75,15 +76,15 @@ public func <<< <T>(inout property: T?, value: AnyObject?) -> T? {
}

// For non-optionals.
public func <<< <T>(inout property: T, value: AnyObject?) -> T {
public func <-- <T>(inout property: T, value: AnyObject?) -> T {
var newValue: T?
newValue <<< value
newValue <-- value
if let newValue = newValue { property = newValue }
return property
}

// Special handling for value and format pair to NSDate conversion.
public func <<< (inout property: NSDate?, valueAndFormat: (value: AnyObject?, format: AnyObject?)) -> NSDate? {
public func <-- (inout property: NSDate?, valueAndFormat: (value: AnyObject?, format: AnyObject?)) -> NSDate? {
var newValue: NSDate?
if let dateString = valueAndFormat.value as? String {
if let formatString = valueAndFormat.format as? String {
Expand All @@ -98,18 +99,16 @@ public func <<< (inout property: NSDate?, valueAndFormat: (value: AnyObject?, fo
return property
}

public func <<< (inout property: NSDate, valueAndFormat: (value: AnyObject?, format: AnyObject?)) -> NSDate {
public func <-- (inout property: NSDate, valueAndFormat: (value: AnyObject?, format: AnyObject?)) -> NSDate {
var date: NSDate?
date <<< valueAndFormat
date <-- valueAndFormat
if let date = date { property = date }
return property
}

// MARK: Operator for quick primitive array deserialization.
// MARK: Primitive Array Deserialization

infix operator <<<* { associativity right precedence 150 }

public func <<<* (inout array: [String]?, value: AnyObject?) -> [String]? {
public func <-- (inout array: [String]?, value: AnyObject?) -> [String]? {
if let stringArray = value as? [String] {
array = stringArray
} else {
Expand All @@ -118,14 +117,14 @@ public func <<<* (inout array: [String]?, value: AnyObject?) -> [String]? {
return array
}

public func <<<* (inout array: [String], value: AnyObject?) -> [String] {
public func <-- (inout array: [String], value: AnyObject?) -> [String] {
var newValue: [String]?
newValue <<<* value
newValue <-- value
if let newValue = newValue { array = newValue }
return array
}

public func <<<* (inout array: [Int]?, value: AnyObject?) -> [Int]? {
public func <-- (inout array: [Int]?, value: AnyObject?) -> [Int]? {
if let intArray = value as? [Int] {
array = intArray
} else {
Expand All @@ -134,14 +133,14 @@ public func <<<* (inout array: [Int]?, value: AnyObject?) -> [Int]? {
return array
}

public func <<<* (inout array: [Int], value: AnyObject?) -> [Int] {
public func <-- (inout array: [Int], value: AnyObject?) -> [Int] {
var newValue: [Int]?
newValue <<<* value
newValue <-- value
if let newValue = newValue { array = newValue }
return array
}

public func <<<* (inout array: [Float]?, value: AnyObject?) -> [Float]? {
public func <-- (inout array: [Float]?, value: AnyObject?) -> [Float]? {

if let floatArray = value as? [Float] {
array = floatArray
Expand All @@ -151,14 +150,14 @@ public func <<<* (inout array: [Float]?, value: AnyObject?) -> [Float]? {
return array
}

public func <<<* (inout array: [Float], value: AnyObject?) -> [Float] {
public func <-- (inout array: [Float], value: AnyObject?) -> [Float] {
var newValue: [Float]?
newValue <<<* value
newValue <-- value
if let newValue = newValue { array = newValue }
return array
}

public func <<<* (inout array: [Double]?, value: AnyObject?) -> [Double]? {
public func <-- (inout array: [Double]?, value: AnyObject?) -> [Double]? {
if let doubleArrayDoubleExcitement = value as? [Double] {
array = doubleArrayDoubleExcitement
} else {
Expand All @@ -167,14 +166,14 @@ public func <<<* (inout array: [Double]?, value: AnyObject?) -> [Double]? {
return array
}

public func <<<* (inout array: [Double], value: AnyObject?) -> [Double] {
public func <-- (inout array: [Double], value: AnyObject?) -> [Double] {
var newValue: [Double]?
newValue <<<* value
newValue <-- value
if let newValue = newValue { array = newValue }
return array
}

public func <<<* (inout array: [Bool]?, value: AnyObject?) -> [Bool]? {
public func <-- (inout array: [Bool]?, value: AnyObject?) -> [Bool]? {
if let boolArray = value as? [Bool] {
array = boolArray
} else {
Expand All @@ -183,14 +182,14 @@ public func <<<* (inout array: [Bool]?, value: AnyObject?) -> [Bool]? {
return array
}

public func <<<* (inout array: [Bool], value: AnyObject?) -> [Bool] {
public func <-- (inout array: [Bool], value: AnyObject?) -> [Bool] {
var newValue: [Bool]?
newValue <<<* value
newValue <-- value
if let newValue = newValue { array = newValue }
return array
}

public func <<<* (inout array: [NSURL]?, value: AnyObject?) -> [NSURL]? {
public func <-- (inout array: [NSURL]?, value: AnyObject?) -> [NSURL]? {
if let stringURLArray = value as? [String] {
array = [NSURL]()
for stringURL in stringURLArray {
Expand All @@ -204,14 +203,14 @@ public func <<<* (inout array: [NSURL]?, value: AnyObject?) -> [NSURL]? {
return array
}

public func <<<* (inout array: [NSURL], value: AnyObject?) -> [NSURL] {
public func <-- (inout array: [NSURL], value: AnyObject?) -> [NSURL] {
var newValue: [NSURL]?
newValue <<<* value
newValue <-- value
if let newValue = newValue { array = newValue }
return array
}

public func <<<* (inout array: [NSDate]?, valueAndFormat: (value: AnyObject?, format: AnyObject?)) -> [NSDate]? {
public func <-- (inout array: [NSDate]?, valueAndFormat: (value: AnyObject?, format: AnyObject?)) -> [NSDate]? {
var newValue: [NSDate]?
if let dateStringArray = valueAndFormat.value as? [String] {
if let formatString = valueAndFormat.format as? String {
Expand All @@ -229,21 +228,19 @@ public func <<<* (inout array: [NSDate]?, valueAndFormat: (value: AnyObject?, fo
return array
}

public func <<<* (inout array: [NSDate], valueAndFormat: (value: AnyObject?, format: AnyObject?)) -> [NSDate] {
public func <-- (inout array: [NSDate], valueAndFormat: (value: AnyObject?, format: AnyObject?)) -> [NSDate] {
var newValue: [NSDate]?
newValue <<<* valueAndFormat
newValue <-- valueAndFormat
if let newValue = newValue { array = newValue }
return array
}

public func <<<* (inout array: [NSDate]?, value: AnyObject?) -> [NSDate]? {

public func <-- (inout array: [NSDate]?, value: AnyObject?) -> [NSDate]? {
if let timestamps = value as? [AnyObject] {
array = [NSDate]()

for timestamp in timestamps {
var date: NSDate?
date <<< timestamp
date <-- timestamp
if date != nil { array!.append(date!) }
}
} else {
Expand All @@ -252,22 +249,20 @@ public func <<<* (inout array: [NSDate]?, value: AnyObject?) -> [NSDate]? {
return array
}

public func <<<* (inout array: [NSDate], value: AnyObject?) -> [NSDate] {
public func <-- (inout array: [NSDate], value: AnyObject?) -> [NSDate] {
var newValue: [NSDate]?
newValue <<<* value
newValue <-- value
if let newValue = newValue { array = newValue }
return array
}

// MARK: Operator for quick class deserialization.

infix operator <<<< { associativity right precedence 150 }
// MARK: Custom Object Deserialization

public protocol Deserializable {
init(data: JSONDictionary)
}

public func <<<< <T: Deserializable>(inout instance: T?, dataObject: AnyObject?) -> T? {
public func <-- <T: Deserializable>(inout instance: T?, dataObject: AnyObject?) -> T? {
if let data = dataObject as? JSONDictionary {
instance = T(data: data)
} else {
Expand All @@ -276,18 +271,16 @@ public func <<<< <T: Deserializable>(inout instance: T?, dataObject: AnyObject?)
return instance
}

public func <<<< <T: Deserializable>(inout instance: T, dataObject: AnyObject?) -> T {
public func <-- <T: Deserializable>(inout instance: T, dataObject: AnyObject?) -> T {
var newInstance: T?
newInstance <<<< dataObject
newInstance <-- dataObject
if let newInstance = newInstance { instance = newInstance }
return instance
}

// MARK: Operator for quick deserialization into an array of instances of a deserializable class.

infix operator <<<<* { associativity right precedence 150 }
// MARK: Custom Object Array Deserialization

public func <<<<* <T: Deserializable>(inout array: [T]?, dataObject: AnyObject?) -> [T]? {
public func <-- <T: Deserializable>(inout array: [T]?, dataObject: AnyObject?) -> [T]? {
if let dataArray = dataObject as? [JSONDictionary] {
array = [T]()
for data in dataArray {
Expand All @@ -299,33 +292,33 @@ public func <<<<* <T: Deserializable>(inout array: [T]?, dataObject: AnyObject?)
return array
}

public func <<<<* <T: Deserializable>(inout array: [T], dataObject: AnyObject?) -> [T] {
public func <-- <T: Deserializable>(inout array: [T], dataObject: AnyObject?) -> [T] {
var newArray: [T]?
newArray <<<<* dataObject
newArray <-- dataObject
if let newArray = newArray { array = newArray }
return array
}

// MARK: Overloading of own operators for deserialization of JSON strings.
// MARK: JSON String Deserialization

private func dataStringToObject(dataString: String) -> AnyObject? {
var data: NSData = dataString.dataUsingEncoding(NSUTF8StringEncoding)!
var error: NSError?
return NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions(0), error: &error)
}

public func <<<< <T: Deserializable>(inout instance: T?, dataString: String) -> T? {
return instance <<<< dataStringToObject(dataString)
public func <-- <T: Deserializable>(inout instance: T?, dataString: String) -> T? {
return instance <-- dataStringToObject(dataString)
}

public func <<<< <T: Deserializable>(inout instance: T, dataString: String) -> T {
return instance <<<< dataStringToObject(dataString)
public func <-- <T: Deserializable>(inout instance: T, dataString: String) -> T {
return instance <-- dataStringToObject(dataString)
}

public func <<<<* <T: Deserializable>(inout array: [T]?, dataString: String) -> [T]? {
return array <<<<* dataStringToObject(dataString)
public func <-- <T: Deserializable>(inout array: [T]?, dataString: String) -> [T]? {
return array <-- dataStringToObject(dataString)
}

public func <<<<* <T: Deserializable>(inout array: [T], dataString: String) -> [T] {
return array <<<<* dataStringToObject(dataString)
public func <-- <T: Deserializable>(inout array: [T], dataString: String) -> [T] {
return array <-- dataStringToObject(dataString)
}
4 changes: 2 additions & 2 deletions JSONHelper/Supporting Files/Mac/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,11 @@
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.4.2</string>
<string>1.5.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>11</string>
<string>12</string>
<key>NSPrincipalClass</key>
<string></string>
</dict>
Expand Down
4 changes: 2 additions & 2 deletions JSONHelper/Supporting Files/iOS/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,11 @@
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.4.2</string>
<string>1.5.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>11</string>
<string>12</string>
<key>NSPrincipalClass</key>
<string></string>
</dict>
Expand Down
Loading

0 comments on commit a54e380

Please sign in to comment.