【问题标题】:swift protocol associatedtypeswift 协议关联类型
【发布时间】:2020-04-14 09:26:47
【问题描述】:

我有一个关于 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?
    }

有可能吗?

【问题讨论】:

    标签: swift protocols


    【解决方案1】:

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

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

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

    let instance = ServiceModule<TestA>()
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-18
      相关资源
      最近更新 更多