繁体   English   中英

swift 协议关联类型

[英]swift protocol associatedtype

我有一个关于 swift 协议关联类型的问题。

protocol SomeProtocol {}

protocol TestAProtocol: SomeProtocol {}

protocol TestBProtocol: SomeProtocol {}

class TestA: TestAProtocol {}

class TestB: TestBProtocol {}

protocol Service {
    associatedtype S: SomeProtocol

    var service: S? { get }
}

class ServiceModule: Service {
    var service: TestAProtocol?
}

此代码有错误,因为 ServiceModule 中的服务类型是协议(TestAProtocol)(不是具体类型)。

class ServiceModule: Service {
    var service: TestA?
}

或者

class ServiceModule: Service {
    var service: TestB?
}

没关系。

但我想要一个符合特定协议(例如 SomeProtocol)的协议(例如 TestAProtocol)的变量。

像这样:

class ServiceModule: Service {
        var service: TestAProtocol? // or var service: TestBProtocol?
    }

可能吗?

这不起作用,因为您没有在 ServiceModule class 中指定关联类型,并且 Swift 编译器无法推断基础类型。 您应该将您的协议用作通用约束:

class ServiceModule<P: TestAProtocol>: Service {
    var service: P?
}

这里P是符合TestAProtocol的具体类型,将在编译时解析。 调用者(类 init)将定义关联的类型。 这里P的类型是TestA

let instance = ServiceModule<TestA>()

要理解的最重要的是,您不能将具有关联类型的协议用作具体类型。 您只能:

  • 使用它作为一个通用约束
  • 使用some关键字(仅适用于函数和计算属性)返回一个不透明的类型来竞标实现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM