Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.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,我希望能够使具有静态属性(字段)的类从基类继承或从协议中混合。每个类都应该有它自己的属性实现。可能吗?它最好是不可变的 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}