【发布时间】:2016-01-05 02:26:42
【问题描述】:
错误:协议“协议”要求“实例”不能被非最终类(“类”)满足,因为它在非参数、非结果类型位置使用“自我”
protocol Protocol {
var instance: Self {get}
}
class Class: Protocol {
var instance: Class {return Subclass()}
}
class Subclass: Class {}
这是我在 C# 中表达我想要的内容的方式。 (据我所知,C# 没有办法强制泛型参数“Self”实际上是我们从 Swift 中知道的 Self,但它作为文档的功能足够好,应该让我做正确的事情。)
interface Protocol<Self> where Self: Protocol<Self> {
Self instance {get;}
}
class Class: Protocol<Class> {
public Class instance {get {return new Subclass();}}
}
class Subclass: Class {}
…在 Swift 的未来版本中可能会是什么样子:
protocol Protocol {
typealias FinalSelf: Protocol where FinalSelf.FinalSelf == FinalSelf
var instance: FinalSelf {get}
}
class Class: Protocol {
var instance: Class {return Subclass()}
}
class Subclass: Class {}
我如何模拟与我的问题相关的部分:
protocol Protocol: ProtocolInstance {
static var instance: ProtocolInstance {get}
}
protocol ProtocolInstance {}
class Class: Protocol {
static var instance: ProtocolInstance {return Subclass()}
}
class Subclass: Class {}
而且,这是我认为与我的代码相关的部分:
protocol Protocol {
static var ????: Self? {get} // an existing instance?
static var ????: Self {get} // a new instance
func instanceFunc()
}
extension Protocol {
static func staticFunc() {
(???? ?? ????).instanceFunc()
}
}
【问题讨论】:
-
看起来像一个错误——您可以使类似的结构适用于实例方法,但不适用于类方法或静态属性。 Have you filed it?
-
我也无法编译。已编辑。
-
我相信您从 C# 更新的示例代码与我的
typealias InstanceType代码完全相同。有一些行为差异吗?如果您在 C# 中调用Subclass.instance(),返回类型(不是实现,而是变量类型)不会是Class? -
问题出在协议的其他地方,我必须使用实例的返回值。我不需要特别说明它是 Self 的子类,但我确实需要它来至少实现 Protocol。 C# 代码的限制使得除了返回 Self 或其子类之外的其他事情变得如此复杂,以至于我什至不知道它是否可能。
标签: swift inheritance protocols