Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 协议中的共享实例属性_Ios_Swift - Fatal编程技术网

Ios 协议中的共享实例属性

Ios 协议中的共享实例属性,ios,swift,Ios,Swift,我必须在协议中保留共享实例属性。在类init中传递协议类型时,我收到错误“protocol”EnvironmentProtocol“只能用作一般约束,因为它具有自身或关联的类型要求” protocol EnvironmentProtocol { static var shared: Self { get set } } final class Enviorenment: EnvironmentProtocol { static var shared: Enviorenment = En

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

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
  }
}

要删除此错误,可以如下重构
Home
类:

class Home<T:EnvironmentProtocol> {
  let env: T

  init(env: T) {
    self.env = env
  }
}
班级主页{
让环境:T
初始(环境:T){
self.env=env
}
}

要删除此错误,可以如下重构
Home
类:

class Home<T:EnvironmentProtocol> {
  let env: T

  init(env: T) {
    self.env = env
  }
}
班级主页{
让环境:T
初始(环境:T){
self.env=env
}
}

正如Emin提到的,这是解决错误的最佳方法

class Home<T: EnvironmentProtocol> {
   typealias EnvironmentType = T
   let env: EnvironmentType

   init(env: EnvironmentType) {
     self.env = env
   }
 }
班级主页{
typealias环境类型=T
let env:EnvironmentType
初始化(环境:环境类型){
self.env=env
}
}
您只能使用符合EnvironmentProtocol的单一类型

let home: Home<MyMemberClass> = Home()
let home:home=home()

正如Emin提到的,这是解决错误的最佳方法

class Home<T: EnvironmentProtocol> {
   typealias EnvironmentType = T
   let env: EnvironmentType

   init(env: EnvironmentType) {
     self.env = env
   }
 }
班级主页{
typealias环境类型=T
let env:EnvironmentType
初始化(环境:环境类型){
self.env=env
}
}
您只能使用符合EnvironmentProtocol的单一类型

let home: Home<MyMemberClass> = Home()
let home:home=home()

谢谢您的回答。但是,我仍然无法理解为什么它一开始就不起作用。“环境协议”中的“自我”不是一种类型。这只是一个模板,你以后应该填写。当编译器使用类“Home”时,它不知道类“environment”。但它看到,你必须给他一个具体的类来代替“自我”。因此,您可以显式地给他这个类(例如“environment”),或者通过添加“”再次使用泛型。谢谢您的回答。但是,我仍然无法理解为什么它一开始就不起作用。“环境协议”中的“自我”不是一种类型。这只是一个模板,你以后应该填写。当编译器使用类“Home”时,它不知道类“environment”。但它看到,你必须给他一个具体的类来代替“自我”。因此,您可以显式地给他这个类(例如“environment”),或者通过添加“”再次使用泛型。