美文网首页面试宝点
求iOS 任意两个类的公共父类

求iOS 任意两个类的公共父类

作者: 兜兜Jerry | 来源:发表于2021-05-23 16:58 被阅读0次

求iOS 两个View的最近公共父类

分析:

1、iOS的集成关系里:所有的类的终极父类:NSObject;
2、iOS 是单继承;
3、算法解析:本质是数据结构中的二叉树,查找一个普通二叉树中两个节点最近的公共祖先问题;

代码:

#warning 求两个View的最近公共父类
- (NSArray *)superClasses:(Class)cls{
        
    if (cls == nil) {
        return @[];
    }
        
    NSMutableArray *res = [NSMutableArray arrayWithCapacity:10];
    while (cls != nil) {
        [res addObject:cls];
        cls = [cls superclass];
    }
    return [res copy];
}
- (Class)commonSuperClsss:(Class)clsA withClssB:(Class )clsB{
        
    NSArray *clsAs = [[[self superClasses:[clsA class]] reverseObjectEnumerator] allObjects];
    NSArray *clsBs = [[[self superClasses:[clsB class]] reverseObjectEnumerator] allObjects];

    NSInteger count = clsAs.count > clsBs.count ? clsBs.count : clsAs.count;
    int idx = -1;
    for (int i = 0; i < count; i ++) {
        idx = i;
        if (clsAs[i] != clsBs[i]) {
            break;
        }
    }
    idx = idx == 0 ? 0 : idx - 1;
    return clsAs[idx];
}

调用:

NSArray *result = [self commonSuperClsss:[UITextField class] withClssB:[UITextView class]];
NSLog(@"== %@", result);

结果:

2021-05-16 13:13:51.449045+0800 TestLearn[22891:1260669] == UIView

相关文章

网友评论

    本文标题:求iOS 任意两个类的公共父类

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