2015-07-13 140 views
0

定義下面下面複雜的對象層次到操場的XCode:斯威夫特繼承/對象結構

class Foo { 
    var name: String 

    required init(name: String) { 
     self.name = name 
    } 
} 

class Bar: Foo { 
} 

class Baz: Bar { 
} 

創建這些類的實例產生混亂的結果:

var foo = Foo(name: "Hello") // renders as {name: "Hello"} 
var bar = Bar(name: "Hello") // renders as {{name: "Hello"}} 
var baz = Baz(name: "Hello") // renders as {{{...}}} 

結果使其顯示barbaz是由其父母的實例組成的對象,而不是從它們繼承。

這是XCode渲染這些對象的方式,還是它們的結構不像我所期望的那樣?

+0

你是什麼意思?他們從他們的父母繼承了'name'字段。這就是繼承的工作原理 –

+0

@Abdul Ahmad:是的 - 名稱屬性不是問題。我的困惑是因爲每個繼承級別都包含在'{}'中,使得它看起來像是一個對象的組合。我期望'foo','bar'和'baz'中的每一個都可以呈現相同的結果(如'{name:「Hello」}') – RRP

+0

噢好吧......那麼爲什麼這麼重要呢?只要對象在創建應用程序時的行爲正確,你應該很好地向右轉 –

回答

0

你看到的只是默認描述,它反映了一個事實,即超到位。

此默認說明在Xcode 7

已經改變了,您可以自定義。 如果您想了解更多詳情,您可以調查reflectMirror的工作原理。

總之,您的子類的鏡像保持(並且必須)跟蹤超類。因此Baz在其鏡像中具有超類,其是Bar,然後Bar在其鏡像中具有超類,其爲Foo。 這就是爲什麼在Xcode 6中,您會看到每個級別子類的封裝都是{}

希望這會有幫助

+1

您的回答讓我轉向http://nshipster.com/mirrortype/,這進一步證明了您的觀點。非常感謝Matteo,非常感謝。 – RRP

0

我認爲這是繼承(和協議採用)的方式在斯威夫特水下工作的方式。可能只是一個C結構,它指向同一種「嵌入式」結構。

E.g.如果您在普通項目中執行相同類型的代碼並對其進行調試,那麼您會看到每個級別的繼承和協議採用都圍繞前一個級別進行「包裝」,每個級別僅提供由其定義的那些方法/屬性。

沒有直接關係,但仍有趣的閱讀:https://stackoverflow.com/a/31325662/1542569

斯威夫特是用C實現的,您可以在這裏看到一個人的分析概述:https://github.com/rodionovd/SWRoute/wiki/Function-hooking-in-Swift

與SWIFT將成爲開放源代碼,我想這個問題會在那個時候更完整地回答。