协议中的共享实例属性
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')或通过添加'正如 Emin 所说,这是解决错误的最佳方法,
class Home<T: EnvironmentProtocol>
typealias EnvironmentType = T
let env: EnvironmentType
init(env: EnvironmentType)
self.env = env
您只能使用符合 EnvironmentProtocol 的单一类型
let home: Home<MyMemberClass> = Home()
【讨论】:
以上是关于协议中的共享实例属性的主要内容,如果未能解决你的问题,请参考以下文章