【问题标题】:Shared Instance property in protocol协议中的共享实例属性
【发布时间】:2020-02-13 18:08:13
【问题描述】:

我必须在协议中保留共享实例属性。在类 init 中传递协议类型时,我收到错误“协议 'EnvironmentProtocol' 只能用作通用约束,因为它具有 Self 或关联的类型要求”。

protocol EnvironmentProtocol {
   static var shared: Self { get set }
}
final class Enviorenment: EnvironmentProtocol {
  static var shared: Enviorenment = Enviorenment()

  private init() { }
}
class Home {
  let env: EnvironmentProtocol

  init(env: EnvironmentProtocol) {
    self.env = env
  }
}

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    要消除此错误,您可以像这样重构 Home 类:

    class Home<T:EnvironmentProtocol> {
      let env: T
    
      init(env: T) {
        self.env = env
      }
    }
    

    【讨论】:

    • 感谢您的回答。但是,我仍然无法理解它最初不起作用的原因。
    • 'EnvironmentProtocol' 中的'Self' 不是类型。它只是一个您应该稍后填写的模板。当编译器使用“Home”类时,它不知道“Enviorenment”类。但它认为你必须给他一个具体的类来代替“自我”。所以你可以明确地给他这个类(例如'Enviorenment')或通过添加''再次使用泛型。
    【解决方案2】:

    正如 Emin 所说,这是解决错误的最佳方法,

    class Home<T: EnvironmentProtocol> {
       typealias EnvironmentType = T
       let env: EnvironmentType
    
       init(env: EnvironmentType) {
         self.env = env
       }
     }
    

    您只能使用符合 EnvironmentProtocol 的单一类型

    let home: Home<MyMemberClass> = Home()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多