diff --git a/Reflect.xcodeproj/project.pbxproj b/Reflect.xcodeproj/project.pbxproj index 117be67..3673b28 100755 --- a/Reflect.xcodeproj/project.pbxproj +++ b/Reflect.xcodeproj/project.pbxproj @@ -290,9 +290,12 @@ TargetAttributes = { 89B833691B842549002C60EB = { CreatedOnToolsVersion = 6.3.1; + LastSwiftMigration = 0820; + ProvisioningStyle = Manual; }; 89B8337E1B84254A002C60EB = { CreatedOnToolsVersion = 6.3.1; + LastSwiftMigration = 0820; TestTargetID = 89B833691B842549002C60EB; }; }; @@ -500,11 +503,13 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = Reflect/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "cn.CF.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; }; name = Debug; }; @@ -513,11 +518,13 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = Reflect/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "cn.CF.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; }; name = Release; }; @@ -537,6 +544,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "cn.CF.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Reflect.app/Reflect"; }; name = Debug; @@ -553,6 +561,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "cn.CF.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Reflect.app/Reflect"; }; name = Release; diff --git a/Reflect.xcodeproj/project.xcworkspace/xcuserdata/Charlin.xcuserdatad/UserInterfaceState.xcuserstate b/Reflect.xcodeproj/project.xcworkspace/xcuserdata/Charlin.xcuserdatad/UserInterfaceState.xcuserstate index 56c02f0..7634dd1 100755 Binary files a/Reflect.xcodeproj/project.xcworkspace/xcuserdata/Charlin.xcuserdatad/UserInterfaceState.xcuserstate and b/Reflect.xcodeproj/project.xcworkspace/xcuserdata/Charlin.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/Reflect/Archiver3.swift b/Reflect/Archiver3.swift index 39d4d9e..0714a88 100755 --- a/Reflect/Archiver3.swift +++ b/Reflect/Archiver3.swift @@ -32,7 +32,7 @@ class Book3: Reflect{ let bookArr = [b1,b2,b3] - let path = Book3.save(obj: bookArr, name: "book3", duration: 0) + let path = Book3.save(obj: bookArr as AnyObject!, name: "book3", duration: 0) print(path) @@ -43,4 +43,4 @@ class Book3: Reflect{ } -} \ No newline at end of file +} diff --git a/Reflect/BugFix1.swift b/Reflect/BugFix1.swift index 86f41c3..abb80e8 100644 --- a/Reflect/BugFix1.swift +++ b/Reflect/BugFix1.swift @@ -8,7 +8,7 @@ import Foundation -let UserDict = ["name": "jack", "age": "28", "img_model": ["url":"http://host.com/1.jpg"]] +let UserDict = ["name": "jack", "age": "28", "img_model": ["url":"http://host.com/1.jpg"]] as [String : Any] class ImageModel: Reflect { @@ -25,7 +25,7 @@ class UserModel: Reflect { class func parse(){ - let user = UserModel.parse(dict: UserDict) + let user = UserModel.parse(dict: UserDict as NSDictionary) print("解析成功:\(user)") } diff --git a/Reflect/JsonConvert.swift b/Reflect/JsonConvert.swift index 86f2cb4..bc2d654 100644 --- a/Reflect/JsonConvert.swift +++ b/Reflect/JsonConvert.swift @@ -18,11 +18,11 @@ class CoachModel: Reflect { static func parse(){ - let d = jsonStr.dataUsingEncoding(NSUTF8StringEncoding) + let d = jsonStr.data(using: String.Encoding.utf8) do{ // id obj=[NSJSONSerialization JSONObjectWithData:correctStringData options:NSJSONReadingAllowFragments error:&error]; - let dict = try? NSJSONSerialization.JSONObjectWithData(d!, options: NSJSONReadingOptions.AllowFragments) + let dict = try? JSONSerialization.jsonObject(with: d!, options: JSONSerialization.ReadingOptions.allowFragments) let m = CoachModel.parse(dict: dict as! NSDictionary) print(m) @@ -36,4 +36,4 @@ class CoachModel: Reflect { } -} \ No newline at end of file +} diff --git a/Reflect/Parse1.swift b/Reflect/Parse1.swift index aa4ce2f..baa28d7 100755 --- a/Reflect/Parse1.swift +++ b/Reflect/Parse1.swift @@ -9,7 +9,7 @@ import UIKit -let Student1Dict = ["name": "jack", "age": "28", "age2": 28,"v1": 98.5, "v2": 568.32414,"isVip":"1"] +let Student1Dict: NSDictionary = ["name": "jack", "age": "28", "age2": 28,"v1": 98.5, "v2": 568.32414,"isVip":"1"] /** 基本测试: 最常见类型的转换 */ class Student1: Reflect { diff --git a/Reflect/Parse2.swift b/Reflect/Parse2.swift index 81b5ade..c6c8391 100755 --- a/Reflect/Parse2.swift +++ b/Reflect/Parse2.swift @@ -7,9 +7,9 @@ // import UIKit +import Foundation - -let Student2Dict = ["name": "jack", "age": 28, "bag": ["color": "blue", "price": 14.5]] +let Student2Dict = ["name": "jack", "age": 28, "bag": ["color": "blue", "price": 14.5]] as [String : Any] /** 在test1的基础上增加自定义对象 */ @@ -28,7 +28,7 @@ class Student2: Reflect { class func parse(){ - let stu2 = Student2.parse(dict: Student2Dict) + let stu2 = Student2.parse(dict: Student2Dict as NSDictionary) print("\(stu2)") } @@ -48,7 +48,8 @@ class Bag: Reflect { init (color: String, price: Float){ self.color = color - self.price = price + + self.price = NSNumber(floatLiteral: Double(price)) } } diff --git a/Reflect/Parse3.swift b/Reflect/Parse3.swift index 5627daa..cd736b2 100755 --- a/Reflect/Parse3.swift +++ b/Reflect/Parse3.swift @@ -8,7 +8,7 @@ import Foundation -let Student3Dict = ["name": "jack", "age": 28, "pens": [["length":5.5],["length":6.5],["length":7.5]],"score": ["88",66,99.5]] +let Student3Dict: NSDictionary = ["name": "jack", "age": 28, "pens": [["length":5.5],["length":6.5],["length":7.5]],"score": ["88",66,99.5]] /** 主要完成数组的转换 */ diff --git a/Reflect/Parse4.swift b/Reflect/Parse4.swift index f1f1b36..9e3b568 100755 --- a/Reflect/Parse4.swift +++ b/Reflect/Parse4.swift @@ -8,7 +8,7 @@ import Foundation -let Student4Dict = ["id":1, "name": "jack", "age": 26,"func": "zoom"] +let Student4Dict = ["id":1, "name": "jack", "age": 26,"func": "zoom"] as [String : Any] /** 主要测试以下功能 */ // 模型中有多余的key @@ -42,8 +42,8 @@ class Student4: Reflect { class func parse(){ - let stu4 = Student4.parse(dict: Student4Dict) + let stu4 = Student4.parse(dict: Student4Dict as NSDictionary) print(stu4) } -} \ No newline at end of file +} diff --git a/Reflect/Parse5.swift b/Reflect/Parse5.swift index 8e4bb32..76be2e5 100755 --- a/Reflect/Parse5.swift +++ b/Reflect/Parse5.swift @@ -8,7 +8,7 @@ import Foundation -let Student5Dict = ["name": "jack", "age": 28,"items1": ["a1","b1","c1"],"items2": ["a2","b2","c2"],"bags": [["color": "red","price": 12.5],["color": "blue","price": 15]]] +let Student5Dict: NSDictionary = ["name": "jack", "age": 28,"items1": ["a1","b1","c1"],"items2": ["a2","b2","c2"],"bags": [["color": "red","price": 12.5],["color": "blue","price": 15]]] /** 主要测试:隐式可选,事实表明,直接可用 */ @@ -27,4 +27,4 @@ class Student5: Reflect { print(stu5) } -} \ No newline at end of file +} diff --git a/Reflect/Parse6.swift b/Reflect/Parse6.swift index c94beb2..7d72419 100755 --- a/Reflect/Parse6.swift +++ b/Reflect/Parse6.swift @@ -8,7 +8,7 @@ import Foundation -let Student6Dict = ["name": "jack", "age": "28","score":"98","items1": ["a1","b1","c1"],"items2": ["a2","b2","c2"],"bags": [["color": "red","price": 12.5],["color": "blue","price": 15]]] +let Student6Dict = ["name": "jack", "age": "28","score":"98","items1": ["a1","b1","c1"],"items2": ["a2","b2","c2"],"bags": [["color": "red","price": 12.5],["color": "blue","price": 15]]] as [String : Any] /** 主要测试:显式可选 */ @@ -24,8 +24,8 @@ class Student6: Reflect { class func parse(){ - let stu6 = Student6.parse(dict: Student6Dict) + let stu6 = Student6.parse(dict: Student6Dict as NSDictionary) print(stu6) } -} \ No newline at end of file +} diff --git a/Reflect/Parse7.swift b/Reflect/Parse7.swift index ec8f102..1a45e3d 100755 --- a/Reflect/Parse7.swift +++ b/Reflect/Parse7.swift @@ -26,17 +26,17 @@ class Student7: Reflect { /** bool */ - override func setValue(value: AnyObject?, forUndefinedKey key: String) { + override func setValue(_ value: Any?, forUndefinedKey key: String) { self.age2 = value as! NSNumber != 0 } class func parse(){ - let stus = Student7.parses(arr: Student7DictArr) + let stus = Student7.parses(arr: Student7DictArr as NSArray) for stu in stus { print(stu) } } -} \ No newline at end of file +} diff --git a/Reflect/Parse8.swift b/Reflect/Parse8.swift index d329746..5d59540 100755 --- a/Reflect/Parse8.swift +++ b/Reflect/Parse8.swift @@ -17,8 +17,8 @@ class Author: Reflect { class func parse(){ - let author = Author.parsePlist("Author") + let author = Author.parsePlist(name: "Author") print(author) } -} \ No newline at end of file +} diff --git a/Reflect/Reflect/Coding/Reflect+ArcFile.swift b/Reflect/Reflect/Coding/Reflect+ArcFile.swift index a711107..a267fa9 100755 --- a/Reflect/Reflect/Coding/Reflect+ArcFile.swift +++ b/Reflect/Reflect/Coding/Reflect+ArcFile.swift @@ -14,15 +14,15 @@ extension Reflect{ static var DurationKey: String {return "Duration"} - class func save(obj obj: AnyObject! , name: String, duration: NSTimeInterval) -> String{ + class func save(obj obj: AnyObject! , name: String, duration: TimeInterval) -> String{ if duration > 0 { - NSUserDefaults.standardUserDefaults().setDouble(NSDate().timeIntervalSince1970, forKey: name) - NSUserDefaults.standardUserDefaults().setDouble(duration, forKey: name + DurationKey) + UserDefaults.standard.set(NSDate().timeIntervalSince1970, forKey: name) + UserDefaults.standard.set(duration, forKey: name + DurationKey) } - let path = pathWithName(name) + let path = pathWithName(name: name) if obj != nil { @@ -30,12 +30,12 @@ extension Reflect{ }else{ - let fm = NSFileManager.defaultManager() - if fm.fileExistsAtPath(path) { + let fm = FileManager.default + if fm.fileExists(atPath: path) { - if fm.isDeletableFileAtPath(path){ + if fm.isDeletableFile(atPath: path){ do { - try fm.removeItemAtPath(path) + try fm.removeItem(atPath: path) }catch { print("删除失败") } @@ -48,19 +48,19 @@ extension Reflect{ return path } - class func read(name name: String) -> (Bool, AnyObject!){ + class func read(name name: String) -> (Bool, AnyObject?){ - let time = NSUserDefaults.standardUserDefaults().doubleForKey(name) - let duration = NSUserDefaults.standardUserDefaults().doubleForKey(name + DurationKey) + let time = UserDefaults.standard.double(forKey: name) + let duration = UserDefaults.standard.double(forKey: name + DurationKey) let now = NSDate().timeIntervalSince1970 - let path = pathWithName(name) + let path = pathWithName(name: name) - let obj = NSKeyedUnarchiver.unarchiveObjectWithFile(path) + let obj = NSKeyedUnarchiver.unarchiveObject(withFile: path) - if time > 0 && duration > 0 && time + duration < now {return (false,obj)} - if obj == nil {return (false,obj)} + if time > 0 && duration > 0 && time + duration < now {return (false,obj as AnyObject?)} + if obj == nil {return (false,obj as AnyObject?)} - return (true,obj) + return (true,obj as AnyObject?) } class func deleteReflectModel(name name: String){save(obj: nil, name: name, duration: 0)} @@ -74,18 +74,18 @@ extension Reflect{ static var cachesFolder: String? { - let cacheRootPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.CachesDirectory, NSSearchPathDomainMask.UserDomainMask, true).last + let cacheRootPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.cachesDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last let cache_reflect_path = cacheRootPath! + "/" + "Reflect" - let fm = NSFileManager.defaultManager() + let fm = FileManager.default - let existed = fm.fileExistsAtPath(cache_reflect_path) + let existed = fm.fileExists(atPath: cache_reflect_path) if !existed { do { - try fm.createDirectoryAtPath(cache_reflect_path, withIntermediateDirectories: true, attributes: nil) + try fm.createDirectory(atPath: cache_reflect_path, withIntermediateDirectories: true, attributes: nil) }catch {} @@ -98,4 +98,4 @@ extension Reflect{ func ignoreCodingPropertiesForCoding() -> [String]? {return nil} -} \ No newline at end of file +} diff --git a/Reflect/Reflect/Dict2Model/Reflect+Parse.swift b/Reflect/Reflect/Dict2Model/Reflect+Parse.swift index 5583946..0addb3f 100755 --- a/Reflect/Reflect/Dict2Model/Reflect+Parse.swift +++ b/Reflect/Reflect/Dict2Model/Reflect+Parse.swift @@ -13,7 +13,7 @@ extension Reflect{ class func parsePlist(name: String) -> Self?{ - let path = NSBundle.mainBundle().pathForResource(name+".plist", ofType: nil) + let path = Bundle.main.path(forResource: name+".plist", ofType: nil) if path == nil {return nil} @@ -28,7 +28,7 @@ extension Reflect{ var models: [Reflect] = [] - for (_ , dict) in arr.enumerate(){ + for (_ , dict) in arr.enumerated(){ let model = self.parse(dict: dict as! NSDictionary) @@ -59,11 +59,13 @@ extension Reflect{ if !type.isArray { + + if !type.isReflect { - print("==========\(type.realType),\(type.isOptional)") + if type.typeClass == Bool.self { //bool - model.setValue(dict[key]?.boolValue, forKeyPath: name) + model.setValue((dict[key] as AnyObject).boolValue, forKeyPath: name) }else if type.isOptional && type.realType == ReflectType.RealType.String{ @@ -89,7 +91,7 @@ extension Reflect{ if dictValue != nil { //字典中有模型 - let modelValue = model.valueForKeyPath(key) + let modelValue = model.value(forKeyPath: key) if modelValue != nil { //子模型已经初始化 @@ -98,46 +100,68 @@ extension Reflect{ }else{ //子模型没有初始化 //先主动初始化 - let cls = ClassFromString(type.typeName) + var tn = type.typeName ?? "" + var cls = ClassFromString(str: tn) model.setValue((cls as! Reflect.Type).parse(dict: dict[key] as! NSDictionary), forKeyPath: name) } } - - } }else{ if let res = type.isAggregate(){ - var arrAggregate = [] if res is Int.Type { - arrAggregate = parseAggregateArray(dict[key] as! NSArray, basicType: ReflectType.BasicType.Int, ins: 0) + + var arrAggregate: [Int] = [] + arrAggregate = parseAggregateArray(arrDict: dict[key] as! NSArray, basicType: ReflectType.BasicType.Int, ins: 0) + model.setValue(arrAggregate, forKeyPath: name) + }else if res is Float.Type { - arrAggregate = parseAggregateArray(dict[key] as! NSArray, basicType: ReflectType.BasicType.Float, ins: 0.0) + + var arrAggregate: [Float] = [] + arrAggregate = parseAggregateArray(arrDict: dict[key] as! NSArray, basicType: ReflectType.BasicType.Float, ins: 0.0) + model.setValue(arrAggregate, forKeyPath: name) + }else if res is Double.Type { - arrAggregate = parseAggregateArray(dict[key] as! NSArray, basicType: ReflectType.BasicType.Double, ins: 0.0) + + var arrAggregate: [Double] = [] + arrAggregate = parseAggregateArray(arrDict: dict[key] as! NSArray, basicType: ReflectType.BasicType.Double, ins: 0.0) + model.setValue(arrAggregate, forKeyPath: name) + }else if res is String.Type { - arrAggregate = parseAggregateArray(dict[key] as! NSArray, basicType: ReflectType.BasicType.String, ins: "") + + var arrAggregate: [String] = [] + arrAggregate = parseAggregateArray(arrDict: dict[key] as! NSArray, basicType: ReflectType.BasicType.String, ins: "") + model.setValue(arrAggregate, forKeyPath: name) + }else if res is NSNumber.Type { - arrAggregate = parseAggregateArray(dict[key] as! NSArray, basicType: ReflectType.BasicType.NSNumber, ins: NSNumber()) + + var arrAggregate: [NSNumber] = [] + arrAggregate = parseAggregateArray(arrDict: dict[key] as! NSArray, basicType: ReflectType.BasicType.NSNumber, ins: NSNumber()) + model.setValue(arrAggregate, forKeyPath: name) + }else{ + + var arrAggregate: [AnyObject] = [] arrAggregate = dict[key] as! [AnyObject] + model.setValue(arrAggregate, forKeyPath: name) + } - model.setValue(arrAggregate, forKeyPath: name) + }else{ - let elementModelType = ReflectType.makeClass(type) as! Reflect.Type + let elementModelType = ReflectType.makeClass(type: type) as! Reflect.Type let dictKeyArr = dict[key] as! NSArray var arrM: [Reflect] = [] - for (_, value) in dictKeyArr.enumerate() { + for (_, value) in dictKeyArr.enumerated() { let elementModel = elementModelType.parse(dict: value as! NSDictionary) @@ -163,22 +187,25 @@ extension Reflect{ if arrDict.count == 0 {return intArrM} - for (_, value) in arrDict.enumerate() { + for (_, value) in arrDict.enumerated() { var element: T = ins let v = "\(value)" - + + if T.self is Int.Type { element = Int(Float(v)!) as! T } - else if T.self is Float.Type {element = v.floatValue as! T} - else if T.self is Double.Type {element = v.doubleValue as! T} - else if T.self is NSNumber.Type {element = NSNumber(double: v.doubleValue!) as! T} - else{element = value as! T} + else if T.self is Float {element = v.floatValue as! T; print("======Float")} + else if T.self is Double.Type {element = v.doubleValue as! T; print("======Double")} + else if T.self is NSNumber.Type {element = NSNumber(value: v.doubleValue!) as! T; print("======NSNumber")} + else if T.self is String.Type {element = v as! T; print("======String")} + else{element = value as! T; print("======else")} + print("========:\(T.self),\(v),\(element.self),\(element)") intArrM.append(element) } diff --git a/Reflect/Reflect/Model2Dict/Reflect+Convert.swift b/Reflect/Reflect/Model2Dict/Reflect+Convert.swift index df746e4..024e74f 100755 --- a/Reflect/Reflect/Model2Dict/Reflect+Convert.swift +++ b/Reflect/Reflect/Model2Dict/Reflect+Convert.swift @@ -23,7 +23,7 @@ extension Reflect{ }else{ - dict[name] = "\(value)".replacingOccurrencesOfString("Optional(", withString: "").replacingOccurrencesOfString(")", withString: "").replacingOccurrencesOfString("\"", withString: "") + dict[name] = "\(value)".replacingOccurrencesOfString(target: "Optional(", withString: "").replacingOccurrencesOfString(target: ")", withString: "").replacingOccurrencesOfString(target: "\"", withString: "") } }else{ @@ -52,7 +52,7 @@ extension Reflect{ }else{ - dict[name] = "\(value)".replacingOccurrencesOfString("Optional(", withString: "").replacingOccurrencesOfString(")", withString: "").replacingOccurrencesOfString("\"", withString: "") + dict[name] = "\(value)".replacingOccurrencesOfString(target: "Optional(", withString: "").replacingOccurrencesOfString(target: ")", withString: "").replacingOccurrencesOfString(target: "\"", withString: "") } } diff --git a/Reflect/Reflect/Reflect.swift b/Reflect/Reflect/Reflect.swift index d2c5ed4..7e99ea5 100755 --- a/Reflect/Reflect/Reflect.swift +++ b/Reflect/Reflect/Reflect.swift @@ -10,6 +10,11 @@ import Foundation class Reflect: NSObject, NSCoding{ + public func encode(with aCoder: NSCoder) { + + } + + lazy var mirror: Mirror = {Mirror(reflecting: self)}() required override init(){} @@ -26,7 +31,7 @@ class Reflect: NSObject, NSCoding{ let hasValue = ignorePropertiesForCoding != nil - print("aDecoder:\(name),\(aDecoder.decodeObjectForKey(name))") + print("aDecoder:\(name),\(aDecoder.decodeObject(forKey: name))") if hasValue { @@ -35,12 +40,12 @@ class Reflect: NSObject, NSCoding{ if !ignore { - self.setValue(aDecoder.decodeObjectForKey(name), forKeyPath: name) + self.setValue(aDecoder.decodeObject(forKey: name), forKeyPath: name) } }else{ - self.setValue(aDecoder.decodeObjectForKey(name), forKeyPath: name) + self.setValue(aDecoder.decodeObject(forKey: name), forKeyPath: name) } } } @@ -60,7 +65,7 @@ class Reflect: NSObject, NSCoding{ if !ignore { - aCoder.encodeObject(value as? AnyObject, forKey: name) + aCoder.encode(value as? AnyObject, forKey: name) } }else{ @@ -68,16 +73,16 @@ class Reflect: NSObject, NSCoding{ if type.isReflect { - aCoder.encodeObject(value as? NSArray, forKey: name) + aCoder.encode(value as? NSArray, forKey: name) }else { - aCoder.encodeObject(value as? AnyObject, forKey: name) + aCoder.encode(value as? AnyObject, forKey: name) } }else { - var v = "\(value)".replacingOccurrencesOfString("Optional(", withString: "").replacingOccurrencesOfString(")", withString: "") - v = v.replacingOccurrencesOfString("\"", withString: "") - aCoder.encodeObject(v, forKey: name) + var v = "\(value)".replacingOccurrencesOfString(target: "Optional(", withString: "").replacingOccurrencesOfString(target: ")", withString: "") + v = v.replacingOccurrencesOfString(target: "\"", withString: "") + aCoder.encode(v, forKey: name) } } } diff --git a/Reflect/Reflect/Reflect/Reflect+Class.swift b/Reflect/Reflect/Reflect/Reflect+Class.swift index cbd2f2e..5f44435 100755 --- a/Reflect/Reflect/Reflect/Reflect+Class.swift +++ b/Reflect/Reflect/Reflect/Reflect+Class.swift @@ -12,9 +12,9 @@ extension Reflect{static var classNameOfString: String {return "\(self)"}} func ClassFromString(str: String) -> AnyClass!{ - if var appName = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleName") as? String { + if var appName = Bundle.main.object(forInfoDictionaryKey: "CFBundleName") as? String { - if appName == "" {appName = ((NSBundle.mainBundle().bundleIdentifier!).characters.split{$0 == "."}.map { String($0) }).last ?? ""} + if appName == "" {appName = ((Bundle.main.bundleIdentifier!).characters.split{$0 == "."}.map { String($0) }).last ?? ""} var clsStr = str @@ -22,7 +22,7 @@ func ClassFromString(str: String) -> AnyClass!{ clsStr = appName + "." + str } - let strArr = clsStr.explode(".") + let strArr = clsStr.explode(separator: ".") var className = "" @@ -30,9 +30,9 @@ func ClassFromString(str: String) -> AnyClass!{ if num > 2 || strArr.contains(appName) { - var nameStringM = "_TtC" + "C".repeatTimes(num - 2) + var nameStringM = "_TtC" + "C".repeatTimes(times: num - 2) - for (_, s): (Int, String) in strArr.enumerate(){ + for (_, s): (Int, String) in strArr.enumerated(){ nameStringM += "\(s.characters.count)\(s)" } @@ -44,7 +44,9 @@ func ClassFromString(str: String) -> AnyClass!{ className = clsStr } - return NSClassFromString(className) + let cls = NSClassFromString(className) + + return cls } return nil; diff --git a/Reflect/Reflect/Reflect/Reflect+Other.swift b/Reflect/Reflect/Reflect/Reflect+Other.swift index ab7637d..db02816 100755 --- a/Reflect/Reflect/Reflect/Reflect+Other.swift +++ b/Reflect/Reflect/Reflect/Reflect+Other.swift @@ -14,7 +14,7 @@ extension Reflect { override var description: String { - let pointAddr = NSString(format: "%p",unsafeBitCast(self, Int.self)) as String + let pointAddr = NSString(format: "%p",unsafeBitCast(self, to: Int.self)) as String var printStr = self.classNameString + " <\(pointAddr)>: " + "\r{" @@ -40,25 +40,30 @@ extension Reflect { extension String{ - func contain(subStr subStr: String) -> Bool {return (self as NSString).rangeOfString(subStr).length > 0} + func contain(subStr subStr: String) -> Bool {return (self as NSString).range(of: subStr).length > 0} func explode (separator: Character) -> [String] { - return self.characters.split(isSeparator: { (element: Character) -> Bool in + + + return self.characters.split(whereSeparator: { (element) -> Bool in + return element == separator }).map { String($0) } + + } func replacingOccurrencesOfString(target: String, withString: String) -> String{ - return (self as NSString).stringByReplacingOccurrencesOfString(target, withString: withString) + return (self as NSString).replacingOccurrences(of: target, with: withString) } func deleteSpecialStr()->String{ - return self.replacingOccurrencesOfString("Optional<", withString: "").replacingOccurrencesOfString(">", withString: "") + return self.replacingOccurrencesOfString(target: "Optional<", withString: "").replacingOccurrencesOfString(target: ">", withString: "") } - var floatValue: Float? {return NSNumberFormatter().numberFromString(self)?.floatValue} - var doubleValue: Double? {return NSNumberFormatter().numberFromString(self)?.doubleValue} + var floatValue: Float? {return NumberFormatter().number(from: self)?.floatValue} + var doubleValue: Double? {return NumberFormatter().number(from: self)?.doubleValue} func repeatTimes(times: Int) -> String{ @@ -70,4 +75,4 @@ extension String{ return strM } -} \ No newline at end of file +} diff --git a/Reflect/Reflect/Reflect/Reflect+Property.swift b/Reflect/Reflect/Reflect/Reflect+Property.swift index 75eb90b..499a083 100755 --- a/Reflect/Reflect/Reflect/Reflect+Property.swift +++ b/Reflect/Reflect/Reflect/Reflect+Property.swift @@ -10,9 +10,9 @@ import Foundation extension Reflect{ - var classNameString: String {return "\(self.dynamicType)"} + var classNameString: String {return "\(type(of: self))"} - func properties(property: (name: String, type: ReflectType, value: Any) -> Void){ + func properties(property: (_ name: String, _ type: ReflectType, _ value: Any) -> Void){ for p in mirror.children { @@ -20,13 +20,13 @@ extension Reflect{ let v = p.value - let reflectType = ReflectType(propertyMirrorType: Mirror(reflecting: v), belongType: self.dynamicType) - - property(name: propertyNameString , type: reflectType, value: v) + let reflectType = ReflectType(propertyMirrorType: Mirror(reflecting: v), belongType: type(of: self)) + + property(propertyNameString , reflectType, v) } } - class func properties(property: (name: String, type: ReflectType, value: Any) -> Void){self.init().properties(property)} + class func properties(property: (_ name: String, _ type: ReflectType, _ value: Any) -> Void){self.init().properties(property: property)} } diff --git a/Reflect/Reflect/Reflect/Reflect+Type.swift b/Reflect/Reflect/Reflect/Reflect+Type.swift index 833e7d5..3b1e459 100755 --- a/Reflect/Reflect/Reflect/Reflect+Type.swift +++ b/Reflect/Reflect/Reflect/Reflect+Type.swift @@ -28,7 +28,7 @@ class ReflectType { var realType: RealType = .None - private var propertyMirrorType: Mirror + var propertyMirrorType: Mirror init(propertyMirrorType: Mirror, belongType: Any.Type){ @@ -68,9 +68,9 @@ extension ReflectType{ displayStyle = propertyMirrorType.displayStyle - if displayStyle == nil && basicTypes.contains(typeName) {displayStyle = .Struct} + if displayStyle == nil && basicTypes.contains(typeName) {displayStyle = .struct} - if extraTypes.contains(typeName) {displayStyle = .Struct} + if extraTypes.contains(typeName) {displayStyle = .struct} // guard displayStyle != nil else {fatalError("[Charlin Feng]: DisplayStyle Must Have Value")} } @@ -81,11 +81,11 @@ extension ReflectType{ switch displayStyle! { - case .Struct: displayStyleDesc = "Struct" - case .Class: displayStyleDesc = "Class" - case .Optional: displayStyleDesc = "Optional"; isOptional = true; - case .Enum: displayStyleDesc = "Enum" - case .Tuple: displayStyleDesc = "Tuple" + case .struct: displayStyleDesc = "Struct" + case .class: displayStyleDesc = "Class" + case .optional: displayStyleDesc = "Optional"; isOptional = true; + case .enum: displayStyleDesc = "Enum" + case .tuple: displayStyleDesc = "Tuple" default: displayStyleDesc = "Other: Collection/Dictionary/Set" } @@ -139,6 +139,7 @@ extension ReflectType{ else if typeName.contain(subStr: "Double") {realType = RealType.Double} else if typeName.contain(subStr: "String") {realType = RealType.String} else if typeName.contain(subStr: "Bool") {realType = RealType.Bool} + else if typeName.contain(subStr: "NSNumber") {realType = RealType.Bool} else {realType = RealType.Class} if .Class == realType && !sdkTypes.contains(typeName) { @@ -151,15 +152,22 @@ extension ReflectType{ let arrayString = type.typeName - let clsString = arrayString.replacingOccurrencesOfString("Array<", withString: "").replacingOccurrencesOfString("Optional<", withString: "").replacingOccurrencesOfString(">", withString: "") +// let clsString = arrayString?.replacingOccurrencesOfString(target: "Array<", withString: "").replacingOccurrencesOfString(target: "Optional<", withString: "").replacingOccurrencesOfString(target: ">", withString: "") - var cls: AnyClass? = ClassFromString(clsString) + var clsString = arrayString?.replacingOccurrencesOfString(target: "Array<", withString: "") ?? "" + print("1==========\(clsString)") + clsString = clsString.replacingOccurrencesOfString(target: "Optional", withString: "") + clsString = clsString.replacingOccurrencesOfString(target: "ImplicitlyUnwrapped", withString: "") + print("2==========\(clsString)") + + var cls: AnyClass? = ClassFromString(str: clsString) if cls == nil && type.isReflect { - let nameSpaceString = "\(type.belongType).\(clsString)" + var nameSpaceString = "\(type.belongType ?? Any.self).\(clsString)" ?? "" + + cls = ClassFromString(str: nameSpaceString) - cls = ClassFromString(nameSpaceString) } return cls! @@ -183,4 +191,4 @@ extension ReflectType{ return self.realType != RealType.Int && self.realType != RealType.Float && self.realType != RealType.Double } -} \ No newline at end of file +} diff --git a/Reflect/ViewController.swift b/Reflect/ViewController.swift index 034d4f6..7bfb79f 100755 --- a/Reflect/ViewController.swift +++ b/Reflect/ViewController.swift @@ -23,7 +23,7 @@ class ViewController: UIViewController { super.viewDidLoad() // Person.reflect() -// +// // Student1.parse() // Student2.parse() // Student3.parse() @@ -32,21 +32,21 @@ class ViewController: UIViewController { // Student6.parse() // Student7.parse() // Author.parse() -// +// // Person1.convert() // Person2.convert() // Person3.convert() // Person4.convert() -// -// + + // Book1.action() // Book2.action() // Book3.action() // UserModel.parse() - +// // AppUserModel.parse() - - CoachModel.parse() +// +// CoachModel.parse() } diff --git a/ReflectTests/ReflectTests.swift b/ReflectTests/ReflectTests.swift index 0ed95a8..4e96eb6 100755 --- a/ReflectTests/ReflectTests.swift +++ b/ReflectTests/ReflectTests.swift @@ -28,7 +28,7 @@ class ReflectTests: XCTestCase { func testPerformanceExample() { // This is an example of a performance test case. - self.measureBlock() { + self.measure() { // Put the code you want to measure the time of here. } }