花了幾天學習swift 寫出字典轉模型的框架 功能字典轉模型 字典數組轉模型數組

XJruntime 9年前發布 | 46K 次閱讀 Apple Swift開發 swift MJExtension

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 就可以了

 本文由用戶 XJruntime 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!