从基类或协议继承的静态字段 - 如何?

时间:2015-03-13 11:23:02

标签: ios swift

我希望能够拥有一个静态属性(字段)的类,该类属于基类的继承或协议的“混合”。每个类都应该有自己的属性实现。可能吗?优选地,它是不可变的。

class C1 {
  static let stProperty = "my prorepty1"
}

class C2 {
  static let stProperty = "my prorepty2"
}

3 个答案:

答案 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
}

同样的事情。

今天,你真的必须将它挂在对象本身上,而不是使用staticclass

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"