2015-10-05 76 views
1

伙计们,我是iOS开发新手几乎2周,我想将自定义对象转换为NSDictionary或NSData。我想将这个复杂的对象传递给Web API来获取和保存。自定义对象NSDictionary或NSData

class customClass{ 
var firstName:String? 
var lastName:String? 
var services:Services 
} 

class Services{ 
var list:[String] = [String]() 
} 

有人可以帮我解决这个请。

回答

0

有点晚了...试试这个在操场上。请注意,它不会正确处理NSData。另外,要使代码正常工作,您需要确保自定义类继承自NSObject并遵守协议Parsable。这是因为您需要使用Objective C运行时来为此解决方案使用类。此外,所有对象都需要是NSObject的子类(例如NSArray,而不是Swift类型的数组)。

import UIKit 

protocol Parsable { 

} 

// Define classes as NSObjects 

class customClass: NSObject, Parsable { 
    var firstName:String? 
    var lastName:String? 
    var services:Services? 
} 

class Services: NSObject, Parsable { 
    var list:NSMutableArray = NSMutableArray() 
} 

// Create objects 

var obj = customClass() 
obj.firstName = "My" 
obj.lastName = "Name" 
var serv = Services() 
serv.list = NSMutableArray() 
serv.list.addObject("AAA") 
serv.list.addObject("BBB") 
obj.services = serv 

// The magic 

func parse(o: NSObject) -> AnyObject { 

    let aClass : AnyClass? = o.dynamicType 
    var propertiesCount : CUnsignedInt = 0 
    let propertiesInAClass : UnsafeMutablePointer<objc_property_t> = class_copyPropertyList(aClass, &propertiesCount) 
    let propertiesDictionary : NSMutableDictionary = NSMutableDictionary() 
    if propertiesCount == 0 { 

     if let a = o as? [NSObject] { 
      return a.map({parse($0)}) 
     } else { 
      // Take into account NSData here!!! 
      return o 
     } 

    } else { 
     for var i = 0; i < Int(propertiesCount); i++ { 

      let property = propertiesInAClass[i] 
      let propertyName = NSString(CString: property_getName(property), encoding: NSUTF8StringEncoding) as! String 
      let propertyValue : AnyObject = o.valueForKey(propertyName)!; 

      if propertyValue is NSObject && propertyValue is protocol<Parsable> { 
       propertiesDictionary.setValue(parse(propertyValue as! NSObject), forKey: propertyName) 
      } else { 
       propertiesDictionary.setValue(propertyValue, forKey: propertyName) 
      } 
     } 

     return propertiesDictionary 
    } 
} 

print(parse(obj)) 
//print(parse(obj.services!)) 
//print(parse(obj.services!.list))