多 protocol 组合使用

Posted by Genie on June 14, 2020

&

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()
    }
}