typealias 探究

typealias 是用来给已经存在的类型重新定义一个新的名字

1
2
3
4
5
6
typealias Sample = UInt32
var num = Sample.min

typealias InputClosure = (String) -> Void
var closure: InputClosure?
closure!("A")

这个和Objective-C中的关键字typedef很相似

1
2
3
4
# define CGFLOAT_TYPE double
typedef CGFLOAT_TYPE CGFloat

typedef void (^InputClosure)(NSString *sourceString);

typealias 在给类型重新定义一个新名字的时候,同时可以使得代码可读性更强,而且语法也变的简单。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class ApiClient {
// ....
func getUsers(success: ((result: AnyObject, operation: AFHTTPRequestOperation) -> Void)? = nil,
error: ((error: NSError, operation: AFHTTPRequestOperation) -> Bool)? = nil,
finished: (() -> Void)? = nil) {
// Do stuff
}
func getUser(user: User, success: ((result: AnyObject, operation: AFHTTPRequestOperation) -> Void)? = nil,
error: ((error: NSError, operation: AFHTTPRequestOperation) -> Bool)? = nil,
finished: (() -> Void)? = nil) {
// Do stuff
}
func getInvitations(success: ((result: AnyObject, operation: AFHTTPRequestOperation) -> Void)? = nil,
error: ((error: NSError, operation: AFHTTPRequestOperation) -> Bool)? = nil,
finished: (() -> Void)? = nil) {
// Do stuff
}
// ....
}

上面的代码不仅读起来吃力,而且很多重复的,代码量也多
我们将typealias应用API client代码中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class ApiClient {
// ....
typealias SuccessHandler = (result: AnyObject, operation: AFHTTPRequestOperation)
-> Void
typealias ErrorHandler = (error: NSError, operation: AFHTTPRequestOperation)
-> Void
typealias FinishedHandler = () -> Void
func getUsers(success: (SuccessHandler)? = nil,
error: (ErrorHandler)? = nil,
finished: (FinishedHandler)? = nil) {
// Do stuff
}
func getUsers(success: (SuccessHandler)? = nil,
error: (ErrorHandler)? = nil,
finished: (FinishedHandler)? = nil) {
// Do stuff
}
func getUser(user: User, success: (SuccessHandler)? = nil,
error: (ErrorHandler)? = nil,
finished: (FinishedHandler)? = nil) {
// Do stuff
}
// ....
}

这种改动更方便读写,而且最棒的是,在调用函数的时候根本不需要任何的改动

1
2
3
4
5
6
7
8
var api = ApiClient()
api.getUsers({ (result, operation) -> Void in
<#code#>
}, error: { (error, operation) -> Bool in
<#code#>
}) { () -> Void in
<#code#>
}

其他的例子也可以看 王巍的文章 TYPEALIAS 和泛型接口,其中讲到的更好理解更典型