Skip to content

Instantly share code, notes, and snippets.

@sooop
Last active August 29, 2015 14:24
Show Gist options
  • Select an option

  • Save sooop/81af5b08ecdfb1e58d65 to your computer and use it in GitHub Desktop.

Select an option

Save sooop/81af5b08ecdfb1e58d65 to your computer and use it in GitHub Desktop.
NSCoder Extension for Encode Swift String and Specific Struct
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