在项目代码中学会利用泛型

174 阅读3分钟
  • 问题描述

    如果我们在编写代码,有些具体的细节我们并不知道,也不太需要知道。异或是在骨架代码中不需要,但保不齐在遵循骨架代码的实现代码中又需要知道具体实现了呢?

  • 引入

    很长一段时间,编写OC 的同学都不知道怎么用泛型。特别是对于编写或看过很老的代码的同学。

    我有如下几个问题想请问大家:

    • 用泛型和写泛型代码的分别是怎么个 操作法?

    • OC 中泛型的局限性。

    • 你在哪里见过泛型的编写。

  • 项目中用到的泛型是什么样子的,如果要自己书写一个使用泛型的类如何书写。

    • 我们项目中如何利用枚举的呢,拿数组举例。(大家可以自行看一下NSArray 暴露的 接口定义)
    
    - (void)organizeStoreGroupArrayFromStoreAry:(NSArray<LBStoreModel *>*)dataArray;
    
    • 自己如何编写
    简单书写
    @interface LBPerson1<ObjectType> : NSObject
    
    - (void)speak:(ObjectType)content;
    
    @end
      
    @implementation LBPerson1
    - (void)speak:(id)content {
        NSLog(@"用 ---  --- 说:%@",content);
    }
    @end
    

    如果要对应LSP 的话我们应该怎么书写呢?

    这里例举一个自定义数组的简单Demo,当然迭代器啥的我就暂时不实现了(重点不在这里)。

    @interface LBContent<__covariant ObjectType> : NSObject
    - (void)addObject:(ObjectType)object;
    @end
      
     @interface LBContent()
    
    @property (nonatomic, strong) NSMutableArray *array;
    
    @end
    
    @implementation LBContent
    
    - (void)addObject:(id)object {
        [self.array addObject:object];
    }
    
    - (NSMutableArray *)array {
        if (!_array) {
            _array = [NSMutableArray array];
        }
        return _array;
    }
    
    @end
    

    调用方法

      LBContent<LBEnglish *> *content = [[LBContent alloc] init];
        
      [content addObject:@"daf"]; // 这里会报一行警告
    

    正确调用:

    LBContent<LBEnglish *> *content = [[LBContent alloc] init];
        
    [content addObject:LBEnglish.new];// 这里就是没问题的
    [content addObject:LBChineseEnglisg.new];// 这一样也是没有警告(原因就在 协变)
    

    至此,上面的普通用法就已经陈述完毕✌️。接下来在项目中如何用,就看具体问题,具体思想,具体设计如何应用编程原则合理的利用这把剑。

OC 重的一些个高级的用法

​ 上面如果有同学 批判那样的LSP 会间接承认可以用继承,对代码不好,那么我们就针对这样的问题进行改进。我们可以先思考下有什么方式?

个人认为这样的方式也是不错的~

@interface LBPerson<ObjectType:id<LBLanguangeProtocol>,ObjectType2:id<NSCopying>> : NSObject

@property (nonatomic, readonly) ObjectType language;

@property (nonatomic, strong) ObjectType2 type2;

- (void)changeLanguaage:(ObjectType)language;

- (void)speak:(NSString *)content;

@end

上面的代码将代码的扩展性预留出来,用什么语言(英,德,中文 )说什么话(图片,文字,语音,好话,坏话)。大家觉得这样的方式如何呢?

分割线


至此单纯解决上面的提出的问题我们是找到方法,并且也顺道找到了泛型的高级用法。 但是! 我们思考上面的代码,真的有必要这么些么?大家可以思考一下,其实可以没有必要,我们完全可以用抽象来解决上面的问题呀。

所以我们在写代码的时候,一定不是为了要用什么技术而用到什么技术,而是碰到什么问题,看一下可以用什么方式来解决。关注什么是变的,什么是不变的,道天地讲法,法有千千万,唯道不变。(个人想的有的没的,如又打扰请忽略~)