2015-06-23 64 views
4

已經剛看了幾個視頻價值類型斯威夫特從今年WWDC,保存的Structs斯威夫特

Building Better Apps With Value Types in Swift
Protocol-Oriented Programming in Swift

我發現自己完全準備好我的應用程序接受的值類型。這意味着更少的類類型和更多的結構。但是,如何保存這些數據?以前,使用類,我會採用NSCoding,但這需要我採用NSObject,這將要求我使用一個類而不是一個結構。

以下是選項,我看到他們:

  • 如果儲蓄是必要的,該模型是一個結構過於複雜,應重新設計爲一類
  • Design my own serialization
  • 使用中介類

我應該怎麼辦?

回答

1

據我所知,整個NSCoding業務旨在用於存儲/檢索對象樹。因此,要求將NSObject作爲基類(可能在未來的某個時刻,它可能會被轉移到AnyObject,我想)。

因此,從這樣的樹中的每個類對它的(某些)屬性的值(包括結構)進行編碼/解碼是一種責任。所有這些結構都將不可避免地作爲某個對象的屬性保留下來,對吧?

鑑於上述情況,我認爲要探索的方向將是與功能擴展NSCoder協議一樣encodeFoo(foo: Foo, forKey key: String)decodeFooForKey(key: String) -> Foo,其中Foo將是你的自定義結構體之一,然後在你的類實現NSCoding協議使用這些功能就像你使用基類Obj-C類型的類似函數一樣。

+1

是的,NSCoding的內置功能之一是,如果你編碼循環無關緊要 - 無論你的對象圖是什麼,「NSCoding」都只會對其中的每個唯一對象編碼一次,而不會分離進入無限循環,如果你例如有一個循環鏈接隊列。這意味着它在一個參考語義世界中,在Objective-C領域。因此,給它一個價值或參考類型的改造可能會有點努力,並且還沒有發生。 – Tommy

+0

@Tommy,用對象可以通過指針唯一標識它們。對於值類型的實例,如何讓它們循環?沒有諷刺意味,只是試圖學習新的東西。 – courteouselk

+1

不,不可能有值語義的循環。我的意思是:鍵控歸檔器具有純粹的Objective-C世界觀,由於語義差異,更新將是一件麻煩事。所以蘋果還沒有。我同意你的初始意圖和設計的第一句話,同時猜測爲什麼蘋果在撰寫本文時還沒有從最初的設計中轉移。 – Tommy