swift 类型“any Protocol”不能符合“Protocol”

brc7rcf0  于 2023-03-07  发布在  Swift
关注(0)|答案(1)|浏览(123)

我遇到了here中描述的类型擦除问题。然而,我很难找到解决方法。在这个快速存储库中提到了“打开存在对象”来解决这个问题,但我不完全确定如何在我的情况下应用它。
下面是一个示例:我正在尝试使用一个通用的“getter”来获取应用程序中的各种服务。这将有助于清理界面,并希望随着更多服务的添加而更具可伸缩性。然而,我在上面描述了一些问题。

protocol Service { }
protocol TestClient: Service {
    func fetchData() -> Data
}
class TestClientImpl: TestClient {
    func fetchData() -> Data {
        return Data()
    }
}

protocol SecondTestClient: Service {
    func fetchDifferentData() -> Data
}
class SecondTestClientImpl: SecondTestClient {
    func fetchDifferentData() -> Data {
        return Data()
    }
}

class ServiceFetcher {
    let services: [Service] = [TestClientImpl(), SecondTestClientImpl()]

    func getService<T: Service>() -> T? {
        for service in services {
            if let finalService = service as? T {
                return finalService
            }
        }
        return nil
    }
}

let serviceFetcher = ServiceFetcher()
let testClient: TestClient? = serviceFetcher.getService() // error: Type 'any TestClient' cannot conform to 'Service'

任何建议将不胜感激,提前感谢!

jum4pzuy

jum4pzuy1#

Swift没有提供任何机制来创建你想要的约束,你可以这样做,只是不像你应该做的那样受类型约束。

import Algorithms

extension ServiceFetcher {
  subscript<Service>(_: Service.Type = Service.self) -> Service? {
    services.firstNonNil { $0 as? Service }
  }
}
ServiceFetcher()[] as (any TestClient)?
ServiceFetcher()[any TestClient]

相关问题