我被困在 Swift 中的协议继承问题上。我正在尝试构建一个接受协议类型 X 数组的 API。该 API 的使用者应该能够传入任何类型的协议类型 X 或任何从协议 X 继承的子协议类型 X'。看起来这可以- 如果没有某种形式的显式将协议类型 X' 转换回协议类型 X,就无法在 Swift 中实现。为什么会这样?我没有看到类类型的这种行为(我怀疑可能是因为继承的工作方式明显不同)。
这是我的代码:
public protocol InjectableService
{}
public protocol ClientDependency
{
func serviceDependencies() -> [InjectableService.Type]
func injectDependencies(dependencies: [InjectableService])
}
public protocol TouchIdServiceInterface : InjectableService
{
func biometricAuthenticate() -> Void
}
public protocol PasswordServiceInterface : InjectableService
{
func passwordAuthenticate() -> Void
}
public class LoginController : ClientDependency
{
private var services: [InjectableService]!
public func injectDependencies(dependencies: [InjectableService]) {
services = dependencies
}
public func serviceDependencies() -> [InjectableService.Type] {
return [TouchIdServiceInterface.self as! InjectableService.Type , PasswordServiceInterface.self as! InjectableService.Type]
}
}
正如您在上面的函数 serviceDependencies() 中看到的那样,我必须将子协议类型转换回其超级协议类型。如果我删除演员表,我会收到一个编译器警告,明确要求我这样做。
有没有办法避免这种情况?我喜欢它可以为你解决的类类型。我真的很想避免这个转换问题,因为它会使使用 API 变得非常笨拙。谢谢!