Class 依赖注入 vs 协议实现

Class with Dependency injection vs Protocol with implementation

下面有两个示例产生相同的结果。试图了解在哪些情况下哪个更好(优点和缺点)。

(1) 两个 类 依赖注入

class ServiceClass {

    init() {}

    func printHelloWorld() {
        print("Hello World")
    }
}

class ExampleClass {
    let service: ServiceClass

    init(service: ServiceClass) {
        self.service = service
    }

    func doSomething() {
        service.printHelloWorld()
    }
}

(2) Class 符合协议

protocol ServiceProtocol {
    func doSomething()
}

extension ServiceProtocol {
    func printHelloWorld() {
        print("hello world")
    }
}

class ExampleClass: ServiceProtocol {

    init() {}

    func doSomething() {
        printHelloWorld()
    }
}

正如@Joakim 在评论中提到的,结合使用这两种方法可能是最好的实现方式。

protocol ServiceProtocol {
    func doSomething()
}

extension ServiceProtocol {
    func printHelloWorld() {
        print("hello world")
    }
}

class ExampleClass {
    let service: ServiceProtocol

    init(service: ServiceProtocol) {
        self.service = service
    }

    func doSomething() {
        service.printHelloWorld()
    }
}