swift关键字:typealias

typealias 类似C、C++、Objective-C中的typedef是用来为已经存在的类型重新定义名字的,通过命名,可以使代码变得更加清晰。

一:使用typedef 定义 指向函数的指针
typedef int (*calculte)(int,int);// 只要是返回int 带有两个参数的都可以使用
#pragma mark 加减法函数
int sum (int value1, int value2)
{
    return value1 + value2;
}
int main(int argc, const char * argv[])
{
    // ------------------------------------------------------------
    // 方式一:不使用typedef
    // ------------------------------------------------------------
    // 定义一个 指向函数 的 指针
    int (*sumTno)(int,int);
    // 指针 指向函数
    sumTno = sum;
    // 通过指针 调用函数
    NSLog(@"sum = %i",sumTno(30,10));
    // ------------------------------------------------------------
    // 方式一:使用typedef 定义指向函数的指针(加法) (缩短了定义 指向函数的指针)
    // ------------------------------------------------------------
    // 定义一个 指向函数 的 指针 并且 指向了函数
    calculte sumTyes = sum;
    // 通过指针 调用函数
    NSLog(@"sum1 = %i",sumTyes(40,10));
}
复制代码
二:使用 typedef 为 Block 起别名
// 注意: 利用typedef给block起别名, 和指向函数的指针一样,block变量的名称 就是别名
typedef int (^calculteBlock) (int,int);
calculteBlock sumBlock = ^(int value1,int value2){
    return value1 + value2;
};
NSLog(@"sumBlock = %i",sumBlock(44,22));

// ------------------------------------------------------------
// ------------------------------------------------------------

typedef void(^Success)(String *);
typedef void(^Failure)(NSError *);
复制代码
三:用typealias给闭包(closure)起别名
typealias Success = (_ data: String) -> Void
typealias Failure = (_ error: String) -> Void
 
func request(_ url: String, success: Success, failure: Failure) {
    // do request here ....
}
复制代码
四:typealias与泛型

typealias 是单一的,也就是说你必须指定将某个特定的类型通过typealias赋值为新名字,而不能将整个泛型类型进行重命名。

// 错误:这样的命名都是无法通过编译的
class Person<T> {}
typealias Worker = Person
typealias Worker = Person<T>
typealias Worker<T> = Person<T>
复制代码
// 正确:一旦泛型类型的确定性得到保证后,我们就可以重命名了
class Person<T> {}
typealias WorkId = String
typealias Worker = Person<WorkId>
复制代码

另一个值得一提的是 Swift 中是没有泛型接口的,但是使用 typealias,我们可以在接口里定义一个必须实现的别名,这在一定范围内也算一种折衷方案。比如在 GeneratorType 和 SequenceType 这两个接口中,Swift 都用到了这个技巧(图片加载库Kingfisher就采用了这种写法),来为接口确定一个使用的类似泛型的特性:

// 图片加载库Kingfisher就采用了这种写法
protocol GeneratorType {
    typealias Element
    mutating func next() -> Self.Element?
}

protocol SequenceType {
    typealias Generator : GeneratorType
    func generate() -> Self.Generator
}
复制代码

参考链接

C++ typedef用法小结 (※不能不看※)

OC-关于Block

TYPEALIAS 和泛型接口

Swift - 关键字(typealias、associatedtype)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值