Objective C范型

本文详细介绍了Objective C中的范型,包括其与Swift的对比、如何创建和使用范型类型、约束、逆变与协变的概念以及范型方法。通过范型,可以提高代码的重用性和安全性,避免类型转换错误,简化编程过程。
摘要由CSDN通过智能技术生成

范型

范型编程是一种程序语言设计范式,它允许程序员在使用强类型的语言编写代码的时候,延迟确定具体的类型。

以Swift代码为例,假如有一个需求是要交换两个int,很容易写出类似代码

func swapTwoInts(_ a: inout Int, _ b: inout Int) {
    let temporaryA = a
    a = b
    b = temporaryA
}

然后,又来了个需求,交换两个double,

func swapTwoDoubles(_ a: inout Double, _ b: inout Double) {
    let temporaryA = a
    a = b
    b = temporaryA
}

于是,有一种类型,就需要Copy/Paste一遍。有一天交换的逻辑要更改,你会发现一下子需要改许多地方。

范型完美的解决了这个问题,使用范型编写的代码,不需要指定具体的类型,而是使用占位符

func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
    let temporaryA = a
    a = b
    b = temporaryA
}

Objective C 范型

Objective C支持轻量级的范型。在编写自定义的范型类之前,我们先来看看Cocoa Touch的集合类(NSArray,NSDictionary,NSSet)对于范型的支持。

首先创建一个数组,这个数组只应该用来存储字符串:

NSMutableArray * array = [[NSMutableArray alloc] init];
[array addObject:@"1"];
//误加了一个非字符串类型进去
[array addObject:@(0)];

这时候,对数组中元素进行遍历,Crash:

[array enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
    NSInteger length = [obj length];
}];

Terminating app due to uncaught exception ‘NSInvalidArgumentException’, reason: ‘-[__NSCFNumber length]: unrecognized selector sent to instance 0xb000000000000002’

如果编译器能帮助我们来确保加入数组中的元素都是String就好了

范型可以帮助我们解决这个问题:

//创建一个保存字符串的数组
NSMutableArray<NSString *> * array = [[NSMutableArray alloc] init];
[array addObject:@"1"];
[array addObject:@(0)];

往这个数组里加入非字符串类型的对象时,编译器会给出警告:

同样的,NSDictionary和NSSet也支持范型:

NSDictionary<NSString *, NSNumber *> * di
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值