2016-02-27 39 views
6

我已經閱讀了Swift文檔並在這裏進行了搜索,但我仍然不確定如何實現類層次結構,其中每個子類都爲繼承的靜態屬性設置自定義值;即:關於在Swift中重寫類屬性的困惑

  1. 基類定義了一個靜態屬性:所有實例共享相同的值。
  2. 子類覆蓋靜態屬性:所有實例共享相同的值,與基類不同。

該屬性是否可以存儲?

另外,我應該如何從一個實例方法(不管特定的類)訪問屬性的值,並且每次都得到正確的值?下面的代碼可以工作嗎?

class BaseClass 
{ 
    // To be overridden by subclasses: 
    static var myStaticProperty = "Hello" 

    func useTheStaticProperty() 
    { 
     // Should yield the value of the overridden property 
     // when executed on instances of a subclass: 
     let propertyValue = self.dynamicType.myStaticProperty 

     // (do something with the value) 
    } 

回答

10

你是如此接近在那裏,但你不能在子類中重寫一個static性能 - 這就是它的意思是static。所以你必須使用class屬性,這意味着它必須是一個計算屬性 - Swift缺少存儲的class屬性。

所以:

class ClassA { 
    class var thing : String {return "A"} 
    func doYourThing() { 
     print(self.dynamicType.thing) 
    } 
} 
class ClassB : ClassA { 
    override class var thing : String {return "B"} 
} 

而且讓我們測試一下:

ClassA().doYourThing() // A 
ClassB().doYourThing() // B 
+0

感謝。所以,如果類變量碰巧包含一些從文件中讀取的大字典(我無法每次計算),那麼我必須爲每個子類設置一個單獨的私有存儲靜態變量,將字典存儲在那裏,並在重寫(計算)類的屬性中返回它的值,對嗎? –

+0

@NicolasMiari解決_「class vars不能被存儲的屬性」的一種方法_限制是將每個類放入其自己的文件_(通常你會這樣做)_然後創建一個文件範圍的存儲區, property var返回類computed-property var,如下所示:'fileprivate static var _thingStorage:String'。然後在你的類中,你的計算屬性變成了'覆蓋類var thing:String {return _thingStorage}'。 –