美文网首页
iOS Swift Scoping 协议的实现

iOS Swift Scoping 协议的实现

作者: money_ac9e | 来源:发表于2022-12-05 20:35 被阅读0次

    iOS

    #define WZLSERIALIZE_COPY_WITH_ZONE()  \
    \
    /*如果不实现copyWithZone:方法,则[personObject copy]时会崩溃*/   \
    - (id)copyWithZone:(NSZone *)zone   \
    {   \
        NSLog(@"%s",__func__);  \
        id copy = [[[self class] allocWithZone:zone] init];    \
        Class cls = [self class];   \
        while (cls != [NSObject class]) {  \
            /*判断是自身类还是父类*/    \
            BOOL bIsSelfClass = (cls == [self class]);  \
            unsigned int iVarCount = 0; \
            unsigned int propVarCount = 0;  \
            unsigned int sharedVarCount = 0;    \
            Ivar *ivarList = bIsSelfClass ? class_copyIvarList([cls class], &iVarCount) : NULL;/*变量列表,含属性以及私有变量*/   \
            objc_property_t *propList = bIsSelfClass ? NULL : class_copyPropertyList(cls, &propVarCount);/*属性列表*/   \
            sharedVarCount = bIsSelfClass ? iVarCount : propVarCount;   \
            \
            for (int i = 0; i < sharedVarCount; i++) {  \
                const char *varName = bIsSelfClass ? ivar_getName(*(ivarList + i)) : property_getName(*(propList + i)); \
                NSString *key = [NSString stringWithUTF8String:varName];    \
                /*valueForKey只能获取本类所有变量以及所有层级父类的属性,不包含任何父类的私有变量(会崩溃)*/  \
                id varValue = [self valueForKey:key];   \
                NSArray *filters = @[@"superclass", @"description", @"debugDescription", @"hash"]; \
                if (varValue && [filters containsObject:key] == NO) { \
                    [copy setValue:varValue forKey:key];    \
                }   \
            }   \
            free(ivarList); \
            free(propList); \
            cls = class_getSuperclass(cls); \
        }   \
        return copy;    \
    }
    
    
    #define WZLSERIALIZE_CODER_DECODER()     \
    \
    - (id)initWithCoder:(NSCoder *)coder    \
    {   \
        NSLog(@"%s",__func__);  \
        Class cls = [self class];   \
        while (cls != [NSObject class]) {   \
            /*判断是自身类还是父类*/    \
            BOOL bIsSelfClass = (cls == [self class]);  \
            unsigned int iVarCount = 0; \
            unsigned int propVarCount = 0;  \
            unsigned int sharedVarCount = 0;    \
            Ivar *ivarList = bIsSelfClass ? class_copyIvarList([cls class], &iVarCount) : NULL;/*变量列表,含属性以及私有变量*/   \
            objc_property_t *propList = bIsSelfClass ? NULL : class_copyPropertyList(cls, &propVarCount);/*属性列表*/   \
            sharedVarCount = bIsSelfClass ? iVarCount : propVarCount;   \
                \
            for (int i = 0; i < sharedVarCount; i++) {  \
                const char *varName = bIsSelfClass ? ivar_getName(*(ivarList + i)) : property_getName(*(propList + i)); \
                NSString *key = [NSString stringWithUTF8String:varName];   \
                id varValue = [coder decodeObjectForKey:key];   \
                NSArray *filters = @[@"superclass", @"description", @"debugDescription", @"hash"]; \
                if (varValue && [filters containsObject:key] == NO) { \
                    [self setValue:varValue forKey:key];    \
                }   \
            }   \
            free(ivarList); \
            free(propList); \
            cls = class_getSuperclass(cls); \
        }   \
        return self;    \
    }   \
    \
    - (void)encodeWithCoder:(NSCoder *)coder    \
    {   \
        NSLog(@"%s",__func__);  \
        Class cls = [self class];   \
        while (cls != [NSObject class]) {   \
            /*判断是自身类还是父类*/    \
            BOOL bIsSelfClass = (cls == [self class]);  \
            unsigned int iVarCount = 0; \
            unsigned int propVarCount = 0;  \
            unsigned int sharedVarCount = 0;    \
            Ivar *ivarList = bIsSelfClass ? class_copyIvarList([cls class], &iVarCount) : NULL;/*变量列表,含属性以及私有变量*/   \
            objc_property_t *propList = bIsSelfClass ? NULL : class_copyPropertyList(cls, &propVarCount);/*属性列表*/ \
            sharedVarCount = bIsSelfClass ? iVarCount : propVarCount;   \
            \
            for (int i = 0; i < sharedVarCount; i++) {  \
                const char *varName = bIsSelfClass ? ivar_getName(*(ivarList + i)) : property_getName(*(propList + i)); \
                NSString *key = [NSString stringWithUTF8String:varName];    \
                /*valueForKey只能获取本类所有变量以及所有层级父类的属性,不包含任何父类的私有变量(会崩溃)*/  \
                id varValue = [self valueForKey:key];   \
                NSArray *filters = @[@"superclass", @"description", @"debugDescription", @"hash"]; \
                if (varValue && [filters containsObject:key] == NO) { \
                    [coder encodeObject:varValue forKey:key];   \
                }   \
            }   \
            free(ivarList); \
            free(propList); \
            cls = class_getSuperclass(cls); \
        }   \
    }
    

    Swift

        func copy(with zone: NSZone? = nil) -> Any {
            let copy = self.classForCoder.alloc()
            let mirror = Mirror(reflecting: self)
            for (key, value) in mirror.children {
                guard let key = key else { continue }
                if value is LiveRoomType, let value = value as? LiveRoomType {
                    copy.setValue(value.rawValue, forKey: key)
                } else {
                    copy.setValue(value, forKey: key)
                }
            }
            return copy
        }
    

    相关文章

      网友评论

          本文标题:iOS Swift Scoping 协议的实现

          本文链接:https://www.haomeiwen.com/subject/cwavfdtx.html