Ios 从基类或协议继承的静态字段-如何?
我希望能够使具有静态属性(字段)的类从基类继承或从协议中混合。每个类都应该有它自己的属性实现。可能吗?它最好是不可变的Ios 从基类或协议继承的静态字段-如何?,ios,swift,Ios,Swift,我希望能够使具有静态属性(字段)的类从基类继承或从协议中混合。每个类都应该有它自己的属性实现。可能吗?它最好是不可变的 class C1 { static let stProperty = "my prorepty1" } class C2 { static let stProperty = "my prorepty2" } 当然,您可以通过协议做到这一点: protocol SomeProtocol { static var foo: String { get } } c
class C1 {
static let stProperty = "my prorepty1"
}
class C2 {
static let stProperty = "my prorepty2"
}
当然,您可以通过协议做到这一点:
protocol SomeProtocol {
static var foo: String { get }
}
class One: SomeProtocol {
class var foo: String {
get {
return "This is One"
}
}
}
顺便说一句,我同意下面罗布·纳皮尔的说法,这是一个有点古怪的功能。我确实认为它可能有一些用例,但我也认为这些用例可以通过其他语言功能更好地实现这是可能的,但在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
}
在很多情况下这并不可怕,因为类的值可能也是该类的任何给定实例的值。这是我们今天所能做的
当然,您的问题可能是您还没有实例,您需要这些信息来构建实例。今天这真的很难,你应该重新考虑你的设计。您通常必须使用其他一些模式,如生成器。更多信息,请参阅
现在你还说,
或协议中的“混合”
我不会在这里说“混合”。如果你真的想用红宝石“mixin”来表达这一点,那么在今天的Swift中就没有这种东西了。Swift的人经常将此功能称为“默认实现”,但目前还不可能实现(尽管我确实希望它最终会实现)。在协议中,您唯一能做的就是说实现者必须以某种方式提供此方法。你不能提供给他们
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"
Rob我看到您编辑了我的答案,并将
类
更改为静态
,但这在Xcode 6.2/Swift 1.1中对我不起作用。这是一个迅速的1.2变化吗?可能是;我正在测试beta版,他们确实对class/static做了一些更改。很抱歉造成混淆。我想要这样做的原因是我想强制C1在其中实现prop
。只要您调用C1.prop
,您就已经强制C1
实现prop
。除非某个函数接受协议(而不是特定的类),否则通过协议您将获得什么好处?为什么不让类在没有协议要求的情况下实现属性呢?对不起,我的意思是我想强制它使用prop。也许将SomeProtocol转换为类更好?这取决于您试图解决的问题。在许多情况下,继承是错误的解决方案。问题是所有的东西从根本上说是“一种X”(在这种情况下,继承是好的),还是它们只是“做类似X的事情”(在这种情况下,协议是正确的答案)。如果有疑问,请使用协议。您对此的具体用例是什么?如何将其改为“let”而不是“var”?“类属性只允许在类中使用;使用“static”声明静态属性”-协议中正确的声明应该是static var stProperty:String{get}