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
}
复制代码
参考链接