我希望能够拥有一个静态属性(字段)的类,该类属于基类的继承或协议的“混合”。每个类都应该有自己的属性实现。可能吗?优选地,它是不可变的。
class C1 {
static let stProperty = "my prorepty1"
}
class C2 {
static let stProperty = "my prorepty2"
}
答案 0 :(得分:2)
当然,你可以使用协议来做到这一点:
protocol SomeProtocol {
static var foo: String { get }
}
class One: SomeProtocol {
class var foo: String {
get {
return "This is One"
}
}
}
顺便说一下,我同意Rob Napier的说法,这有点像一个奇怪的功能。我认为可能有用例,但我也认为可以用其他语言功能更好地实现这些功能
答案 1 :(得分:2)
这是可能的,但在Swift中使这很有用真的很难。您打算如何参考这家酒店?让我们从超简单的实现开始:
protocol SomeProtocol {
static var prop: String { get }
}
class C1: SomeProtocol {
static let prop = "This is One"
}
大。所以现在我想要一个使用它的函数:
func useProp(x: SomeProtocol) -> String {
return x.prop
// 'SomeProtocol' does not have a member named 'prop'
}
这不起作用。 x
是一个实例,但我想要类型。
// Accessing members of protocol type value 'SomeProtocol.Type' is unimplemented
func useProp(x: SomeProtocol.Type) -> String {
return x.prop
}
这可能是某天 工作的原因,因为“未实现”这个词。但它今天不起作用。
func useProp(x: SomeProtocol) -> String {
// Accessing members of protocol type value 'SomeProtocol.Type' is unimplemented
return x.dynamicType.prop
}
同样的事情。
今天,你真的必须将它挂在对象本身上,而不是使用static
或class
:
protocol SomeProtocol {
var prop: String { get }
}
class C1: SomeProtocol {
let prop = "This is One"
}
func useProp(x: SomeProtocol) -> String {
return x.prop
}
在许多情况下,这并不是那么糟糕,因为类的值可能也任何给定的类实例的值。这就是我们今天所能做的一切。
当然,您的问题可能是您还没有实例,并且您需要此信息来构建实例。今天真的很难,你应该重新考虑你的设计。您通常必须使用其他一些类似Builder的模式。有关详情,请参阅Generic Types Collection。
现在你也说了:
来自协议的或“混合”
我不会在这里说“混合”。如果你真的把它称为Ruby“mixin”,那么今天的Swift就没有这样的东西了。 Swift人经常将此功能称为“默认实现”,目前还不可能(尽管我确实最终会这样做)。你在协议中唯一能做的就是说实现者必须以某种方式提供这种方法。你不能为他们提供。
答案 2 :(得分:2)
protocol P {
class var stProperty: String { get }
}
class C1 {
class var stProperty: String {
return = "my property1"
}
}
class C2 {
class var stProperty: String {
return = "my property2"
}
}
用法:
C2.prop //"my property2"
如果您尝试:
C2.prop = "new value" //"cannot assign to the result of this expression"