【发布时间】:2017-01-03 01:22:48
【问题描述】:
我在 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 变得非常笨拙。谢谢!
【问题讨论】:
-
有趣。玩了几分钟,也搞不明白。
-
您将通过更简单的测试用例获得更好的答案:swiftlang.ng.bluemix.net/#/repl/586b038cfbf6b56680985c96
-
TouchIdServiceInterface.self 返回 TouchIdServiceInterface.Protocol 的类型,而不是 TouchIdServiceInterface.Type。
-
func serviceDependencies() -> [InjectableService.Type]的返回类型有什么用? -
这是Protocol doesn't conform to itself? -
TouchIdServiceInterface.self的(又一个)变体(协议类型本身 - 类型为TouchIdServiceInterface.Protocol,而不是TouchIdServiceInterface.Type)不能转换为InjectableService.Type( 符合到InjectableService的类型——TouchIdServiceInterface不符合)。
标签: swift inheritance swift-protocols protocol-inheritance