 
 
 //得到所有的属性即value
-protocol PropertieValues {
+protocol PropertieValues: MirrorResult {
     /// 得到所有的属性及其对应的value组成dic，注意value不一定全是基础数据类型，可能是其他自定义对象。同时，dic中存储的都是有值的属性，那些没有赋值的属性不会出现在dic中
     ///
     /// - Returns: dic
     func codablePropertieValues() -> [String:AnyObject]
     
     //遍历所有的属性列表，将所有的属性存储到数组中
-    func codableProperties() -> [String]
+    func allProperties() -> [String]
 }
 
 //MARK: - PropertieValues协议
 extension PropertieValues {
-    func getPropertieValuesWithMirror(mir : Mirror) -> [String:AnyObject] {
-        var result: [String:AnyObject] = [:]
-        if let superMirror = mir.superclassMirror {
-            result = getPropertieValuesWithMirror(mir: superMirror)
-        }
-        for case let (label?, value) in (mir.children) {
-            result[label] = unwrap(any: value) as AnyObject?
-        }
-        return result
-    }
-    
+//    func getPropertieValuesWithMirror(mir : Mirror) -> [String:AnyObject] {
+//        var result: [String:AnyObject] = [:]
+//        if let superMirror = mir.superclassMirror {
+//            result = getPropertieValuesWithMirror(mir: superMirror)
+//        }
+//        for case let (label?, value) in (mir.children) {
+//            result[label] = unwrap(any: value) as AnyObject?
+//        }
+//        return result
+//    }
+//    
     
     /// 得到所有的属性及其对应的value组成dic，注意value不一定全是基础数据类型，可能是其他自定义对象。同时，dic中存储的都是有值的属性，那些没有赋值的属性不会出现在dic中
     ///

    
    public required init?(coder aDecoder: NSCoder) {
        super.init()
        let arr = codableProperties()
        for key in arr {
            let object = aDecoder.decodeObject(forKey: key)
            self.setValue(object, forKey: key)


import UIKit

//MARK: - MirrorResult，使用mirror遍历所有的属性和值，通过action传出做相应的处理
protocol MirrorResult {
    
    /// 使用mirror遍历所有的属性和值
    ///
    /// - Parameters:
    ///   - mir: mirror
    ///   - action: 要对属性和值做什么处理
    func getResultFromMirror(mir : Mirror, action: (_ label: String?, _ value : Any) -> Void)
}

extension MirrorResult {
    
    func getResultFromMirror(mir : Mirror, action: (_ label: String?, _ value : Any) -> Void) {
        if let superMirror = mir.superclassMirror { //便利父类所有属性
            getResultFromMirror(mir: superMirror, action: action)
        }
        if (mir.children.count) > 0  {
            for case let (label?, value) in (mir.children) {
                action(label, value)
            }
        }
    }
}


//MARK: - JSON协议
//自定义一个JSON协议
protocol JSON: MirrorResult {
    
    /// 如果是对象实现了JSON协议，这个方法返回对象属性及其value的dic，注意如果某个value不是基础数据类型，会一直向下解析直到基础数据类型为止，另外可选类型和数组需要单独处理
    /// 如果是基础数据类型实现了JSON协议，只返回他们自己
