&
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| protocol A {
func test() -> Int
}
protocol B {
func test() -> String
}
typealias C = A & B //合并通过C 别名来使用,清晰避免冗余,歧义
class H: C {
func test() -> Int {
return 1
}
func test() -> String {
return "B"
}
}
|
swift 协议里面方法可以重名,但是返回值不能一样
但是调用的时候会产生迷糊,编译器怎么区分,我们可以通过 as
1
2
3
| let instance = H()
let num1 = (instance as A).test() //1
let string = (instance as B).test() //"B"
|
associatedtype
协议中经常使用 associatedtype
来起到占位的作用,就是说他搬个凳子占在这里,但是大家都不知道是谁占的。
具体是谁只能到运行的时候我们才能通过编译器知道,这很好的和范型结合在一起 T,可以大大减少代码。
比如我在网络层封装中,我通过associatedtype
来占位我的是谁request,和返回response, 只需要cover 实现
1
2
3
4
5
6
7
| public protocol NetworkRouter: class {
associatedtype EndPoint
associatedtype ResponseObject
func request(with route: EndPoint,
completion: @escaping NetworkRouterCompletion<ResponseObject>)
func cancel()
}
|
1
2
3
4
5
6
7
8
9
10
11
12
| public class Router<E: EndpointType, R: Codable>: NetworkRouter {
public typealias EndPoint = E
public typealias ResponseObject = R
public func request(with route: E, completion:
@escaping (R?, URLResponse?, NetworkResponseError?) -> Void) {
//....
}
public func cancel() {
// ...
// task?.cancel()
}
}
|