2016-11-26 8 views
1

私はできるだけ多くのものが構造体(Int、String、Array、Dictionary、ほとんどすべてです)であるので、できるだけ構造体をSwiftで使うことを勧めました。Swiftの構造体との関係を扱うには?

私は対処するために(逆の)関係があれば、特にUITableViewのデータソースの場合は、という満足のいく解決策を思いつくことができませんでした。多くの例:Playerが複数あり、それぞれがPlayerGameオブジェクトは複数のGameを持っています。

アプローチ1

私は、リスト内の同じ構造体のすべてのインスタンスは、私が各インスタンスにIDを与える、と私はリストに私は、関連するオブジェクトを必要とするたびにフェッチ格納します。私は構造体から離れて移動する2つの

var allGames: [Game] = [] 
struct Game { 
    let id: String 
    var playerIds: [String] 
    var players: [Player] { 
     get { return allPlayers.filter({ playerIds.contains($0.id) }) } 
    } 
} 
var allPlayers: [Player] = [] 
struct Player { 
    let id: String 
    var gameIds: [String] 
    var games: [Game] { 
     get { return allGames.filter({ gameIds.contains($0.id) }) } 
    } 
} 

アプローチ。

class Game { 
    var players: [Player] = [] 
} 
class Player { 
    var games: [Game] = [] 
} 

スウィフトにおける構造体との関係をどのように扱うか質問

? 2つのアプローチのどちらか一方が他方よりも優れた方法であるか、それともより良い方法がありますか?

答えて

2

クラスの代わりに構造体を使用するように指示されましたか?あなたは持っていた。あるいは、あなたが適切に得たアドバイスを理解できなかっただけです。

構造体は、値タイプです。クラスは参照タイプです。つまり、構造体への参照を持つことはできません。 2つの構造体= 2つの異なるオブジェクト=メモリの2倍。クラスインスタンスへの参照を持つことができます。

1000人のプレーヤーがすべて同じゲームをプレイしているとします。構造体では、1000個のゲームのコピーがあります。さらに悪いことに、ゲームには各プレイヤーのコピーがあります。各プレイヤーにはゲームのコピーがあり、各プレイヤーのコピーがあり、それぞれにはゲームのコピーがあります。

だから、プレイヤーとゲームを作るのはクラスです。

+0

他のアドバイスの中でも、アップルは 'struct restaurant'の例を使っています:https://developer.apple.com/swift/blog/?id=37 –