花了幾天學習swift 寫出字典轉模型的框架 功能字典轉模型 字典數組轉模型數組
import UIKit
let Prefix = "T@"
let Prefix1 = ","
let temp = "."
var CoustomPrefix:String?
var Cla :AnyClass?
var arrayObj = NSArray()
var valueObj:String?
extension NSObject {
/// 通過字典來創建一個模型 @param keyValues 字典 @return 新建的對象如果你的模型中有Number Int 8 32 64等 請寫成String 預防類型安全
class func objectWithKeyValues(Dict:NSDictionary)->Self{
var objc = self.alloc()
var count:UInt32 = 0
// var ivars = class_copyIvarList(self.classForCoder(), &count)
var properties = class_copyPropertyList(self.classForCoder(),&count)
for var i = 0; i < Int(count); ++i{
//var ivar :Ivar = ivars[i]
var propert : objc_property_t = properties[i];
var keys : NSString = NSString(CString: property_getName(propert), encoding: NSUTF8StringEncoding)!
var types : NSString = NSString(CString: property_getAttributes(propert), encoding: NSUTF8StringEncoding)!
var value :AnyObject? = Dict[keys]
CoustomPrefix = (types as NSString).substringFromIndex(Prefix.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))
if !CoustomPrefix!.hasPrefix(Prefix1){
var CustomValueName:String? = CoustomPrefix!.componentsSeparatedByString(Prefix1).first!
if value != nil{
// 自定義類型
if value!.isKindOfClass(NSDictionary.classForCoder()) { // Dic
// 根據類型字符串創建類
Cla = swiftClassFromString(CustomValueName!)
if Cla != nil {
// 將轉換后的類作為Value
var CustomValueObject: AnyObject = Cla!.objectWithKeyValues(value as! NSDictionary)
objc.setValue(CustomValueObject, forKey: keys as String)
}
}
}
}
if value != nil{
let strCls:AnyClass = NSString.classForCoder()
let Number:AnyClass = NSNumber.classForCoder()
let ArrayCls:AnyClass = NSArray.classForCoder()
// swift 類型安全很重要 類型轉換
if value!.isKindOfClass(NSArray.classForCoder()){ //
objc.setValue(value!, forKeyPath:keys as String)
//objc.setValue(value!.allObjects, forKey: keys as String)
}
if value!.isKindOfClass(strCls) {//string
valueObj = String(format: "\(value!)")
objc.setValue(valueObj, forKeyPath:keys as! String)
}
if value!.isKindOfClass(Number){ // Number
valueObj = String(format: "\(value!)")
objc.setValue(valueObj, forKeyPath:keys as! String)
}
if value!.isKindOfClass(NSURL.classForCoder()){ // url
valueObj = String(format: "\(value!)")
objc.setValue(valueObj, forKeyPath:keys as! String)
}
if value!.isEqual(Bool() as AnyObject){
valueObj = String(format: "\(value!)")
objc.setValue(valueObj, forKeyPath:keys as! String)
}
}
}
return objc
}
/// 得到自定義類型的類名 如果你的模型中有Number Int 8 32 64等 請寫成String 預防類型安全
private class func swiftClassFromString(className: String) -> AnyClass! {
if var appName: String = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleName") as! String? {
let typeStr = "\""
if className.hasPrefix(typeStr){
// "\"User1\""
var rang = (className as NSString).substringFromIndex(typeStr.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))
// 類型字符串截取
var length = rang.lengthOfBytesUsingEncoding(NSUTF8StringEncoding)
// User1\""
rang = (rang as NSString).substringToIndex(length.hashValue-1)
return NSClassFromString("\(appName).\(rang)")
}
}
return nil;
}
/// 通過字典數組來創建一個模型數組 @param keyValuesArray 字典數組 @return 模型數組 如果你的模型中有Number Int 8 32 64等 請寫成String 預防類型安全
class func objectArrayWithKeyValuesArray(keyValuesArray:[[String:AnyObject]])->NSArray{
var modelArray = NSMutableArray()
var array = NSArray()
for dict in keyValuesArray{
// 這里的做判斷防止出錯不會寫了
// if keyValuesArray.isKindOfClass([[String:AnyObject]]){
var model:AnyObject = objectWithKeyValues(dict)
modelArray.addObject(model)
// }else{
// 打印提示信息可能不是一個字典數組
// }
array = modelArray
}
return array
}
/// 通過plist來創建一個模型數組 @param file 文件全路徑 @return 新建的對象 如果你的模型中有Number Int 8 32 64等 請寫成String 預防類型安全
class func objectArrayWithFilename(filename:String!)->NSArray{
let filePath = NSBundle.mainBundle().pathForResource(filename, ofType: nil)
if filePath != nil {
var dict = NSDictionary(contentsOfFile: filePath!)
let statuses: AnyObject? = dict?.allKeys.first
var value: AnyObject? = dict!.objectForKey(statuses!)
if value!.isKindOfClass(NSArray.classForCoder()){
if value != nil{
arrayObj = objectArrayWithKeyValuesArray(value as! [[String : AnyObject]])
return arrayObj
}
}else{
if value != nil {
println("Value 不是一個字典數組 請使用其他方法")
return arrayObj
}
}
}
println("文件路徑不對,可能文件名有誤請查證")
return arrayObj
}
/// 通過plist來創建一個模型 @param filename 文件名(僅限于mainBundle中的文件) @return 模型數組 如果你的模型中有Number Int 8 32 64等 請寫成String 預防類型安全
class func objectWithFileName(filename:String!)->Self{
let filePath = NSBundle.mainBundle().pathForResource(filename, ofType: nil)
var dict = NSDictionary(contentsOfFile: filePath!)
let statuses: AnyObject? = dict?.allKeys.first
var value: AnyObject? = dict!.objectForKey(statuses!)
var objc = self.alloc()
if value != nil {
if value!.isKindOfClass(NSDictionary.classForCoder()){
objc = objectWithKeyValues(value! as! NSDictionary)
return objc
}else{
println("value 不是一個字典")
}
}
println("value 沒有值")
return objc
}
}
https://github.com/TanXiangJie/XJruntime.git Swift字典轉模型 和數組字典轉模型 和通過Plist文件創建 寫swift的同學可以去Github上下載 只要會用MJExtension 就可以了