协议中的共享实例属性

Posted

技术标签:

【中文标题】协议中的共享实例属性【英文标题】: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
  

【问题讨论】:

【参考方案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()

【讨论】:

以上是关于协议中的共享实例属性的主要内容,如果未能解决你的问题,请参考以下文章

JS中的原型对象与构造器

Pig 中的 Udfs 共享上下文

面试:原型链

JavaScriptprototype定义的属性在实例中的表现

⑤创建型设计模式原型模式

10类属性实例(对象)属性,多态