2016-11-26 70 views
1

我被建議儘可能在Swift中使用結構體,因爲已經有很多結構體(Int,String,Array,Dictionary,幾乎所有東西都是)。如何處理與Swift中的結構體的關係?

但是,如果我有一個關係(有反向)來處理,我不能拿出一個令人滿意的解決方案,尤其是在數據源的一個UITableView的情況。一個例子是:Game對象有多個Player,並且每個Player有多個Game

辦法一個

我存儲在一個列表中的相同結構的所有實例,我給一個ID,每個實例,每次我需要相關對象的時候,我取的名單。

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

你被告知使用結構而不是類?你已經有了。或者你只是不明白你得到的任何建議。

結構是值類型。類是參考類型。這意味着你不能引用結構體。兩個結構=兩個不同的對象=內存的兩倍。你可以引用類實例。

假設你有1000名玩家都玩同一款遊戲。有了結構,你有1000個遊戲副本。更糟糕的是,遊戲中會有一個每個玩家的副本,每個玩家都有一個遊戲副本,每個玩家都有一個副本,每個副本都有一個遊戲副本,永遠都是如此。

這就是爲什麼你讓球員和遊戲

+0

那麼,除了其他建議,Apple使用'struct Restaurant'的例子:https://developer.apple.com/swift/blog/?id = 37 –