Ios 协议中的共享实例属性
我必须在协议中保留共享实例属性。在类init中传递协议类型时,我收到错误“protocol”EnvironmentProtocol“只能用作一般约束,因为它具有自身或关联的类型要求”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
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”),或者通过添加“”再次使用泛型。