Last active
August 29, 2015 14:24
-
-
Save sooop/81af5b08ecdfb1e58d65 to your computer and use it in GitHub Desktop.
NSCoder Extension for Encode Swift String and Specific Struct
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| extension NSCoder { | |
| // Encode String | |
| func encodeString(string:String, forKey key:String) { | |
| self.encodeObject(string as NSString, forKey:key) | |
| } | |
| func decodeStringForKey(key:String) -> String { | |
| let ns = self.decodeObjectForKey(key) as! NSString | |
| return ns as String | |
| } | |
| // Encode Array of Primary Types | |
| func encodeArray<C:CollectionType, T where C.Generator.Element == T>(array:C, forKey key:String) -> NSData { | |
| let length = sizeof(T.Type) * array.count | |
| var ptr = UnsafeMutablePointer<T>.alloc(array.count) | |
| var arrptr = UnsafeMutableBufferPointer<T>(start:ptr, count:array.count) | |
| for (i, n) in enumerate(array) { | |
| arrptr[i] = n | |
| } | |
| let tempData = NSData(bytes:ptr, length:length) | |
| self.encodeObject(tempData, forKey:key) | |
| ptr.dealloc(array.count) | |
| } | |
| func decodeArrayForKey<T>(key:String) -> Array<T> { | |
| let data = self.decodeObjectForKey(key) | |
| let length = data.length | |
| let count = length / sizeof(T.Type) | |
| var ptr = UnsafeMutablePointer<T>.alloc(count) | |
| data.getBytes(ptr, length:length) | |
| var arrptr = UnsafeBufferPointer(start:ptr, count:count) | |
| let result = Array(arrptr) | |
| ptr.dealloc(count) | |
| return result | |
| } | |
| // Encode Specific Struct Type | |
| /* | |
| struct Person { | |
| let firstName:String | |
| let lastName:String | |
| let age:Int | |
| } | |
| */ | |
| func encodePerson(person:Person, forKey key:String) { | |
| self.encodeInteger(person.age, forKey:"\(key)_age") | |
| self.encodeString(person.lastName, forKey:"\(key)_lastName") | |
| self.encodeString(person.firstName, forKey:"\(key)_firstName") | |
| } | |
| func decodePersonForKey(key:String) -> Person { | |
| let fN = self.decodeStringForKey("\(key)_firstName") | |
| let lN = self.decodeStringForKey("\(key)_lastName") | |
| let age = self.decodeIntegerForKey("\(key)_age") | |
| return Person(firstName:fN, lastName:lN, age:age) | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment