我遇到了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'
任何建议将不胜感激,提前感谢!
1条答案
按热度按时间jum4pzuy1#
Swift没有提供任何机制来创建你想要的约束,你可以这样做,只是不像你应该做的那样受类型约束。