2017-05-01 4 views
2

これは正しい方法だと100%は確信していませんが、私はいくつかの変数を格納するクラスを持っていますこれらのオブジェクト。辞書にオブジェクト配列を格納してアクセスする - Swift 3 - macOS

私はいくつかの配列を持つ必要がないように、これらのオブジェクトを辞書に入れようとしています。辞書のキーを使用して、必要な配列のセットを特定できるという考えです。

例えば、私は

class Player { 

init(FirstName: String, LastName:String, Team: String, Pos: String, Line: Int, GaP: Int, Sh: Int, ShotPerc: Float, TOIPerG: Float, ShiPerG: Float, TOIPerShi: Float, FaceOffPer: Float, HitA: Int, HitF: Int, SavePerc: Float){ 
    lastName = LastName 
    firstName = FirstName 
    team = Team 
    pos = Pos 
    line = Line 
    GP = GaP 
    sh = Sh 
    shotPerc = ShotPerc 
    TOIPerGame = TOIPerG 
    shiftsPerGame = ShiPerG 
    TOIPerShift = TOIPerShi 
    faceOffPerc = FaceOffPer 
    hitA = HitA 
    hitF = HitF 
    savePerc = SavePerc 
} 

を持っている私は、(のみ関連するコードを示したチームによってフィルタリング別々の配列にこれらを保存するが、私はプレーヤーの配列にCSVファイルを解析し、適切なにそれらを置くためにフィルタを使用配列は)

players.append(Player(FirstName: record["First Name"]!, LastName: record["Last Name"]!, Team: record["Team"]!, Pos: record["Pos"]!, Line: Int(record["Line"]!)!, GaP: Int(record["GP"]!)!, Sh: Int(record["Sh"]!)!, ShotPerc: Float(record["ShotPerc"]!)!, TOIPerG: Float(record["TOIPerGame"]!)!, ShiPerG: Float(record["ShiftsPerG"]!)!, TOIPerShi: Float(record["TOIPerShift"]!)!, FaceOffPer: Float(record["FOffPerc"]!)!, HitA: Int(record["HitA"]!)!, HitF: Int(record["HitF"]!)!, SavePerc: Float(record["SavePerc"]!)!)) 

    var FLA = [Player]() 
    var TBL = [Player]() 
    var DET = [Player]() 
    var WSH = [Player]() 
    var PIT = [Player]() 
    var NYR = [Player]() 
    var NYI = [Player]() 

これは辞書にそれらすべてを入れたい乱雑エルゴに見えるが、それはキーを拭いていますおそらくので、私は、そこに一つのオブジェクトを取得することができます。私の質問は、同じキーの下にすべてのプレーヤーを格納するにはどうすればいいですか?

var dict: [String: Array<Player>] = [:] 

for (player, _) in LAK.enumerated(){ 
      dict = ["LAK":[LAK[player]]] 
     } 
     print(dict["LAK"]?[0].fullName()) 

私はそれが

dict["LAK"] = 

の線に沿ってより多くのですが、私はサークルでつもりのように私は感じ想定しています!

ありがとうございます!

+0

申し訳ありませんが、私は正確に*あなたの問題を理解できません。 CSVを読む?辞書?あなたの質問には多くの情報があります。 – Macabeus

答えて

0

すべてのプレーヤーを同じkeyに保存する場合は、最初にすべてのプレーヤーを収集し、対応するkeyに追加します。

プレイヤーをcsvから読み込んだとします。私は疑似コードを書いています。

// For playerData in readPlayerFormCSV() 
    // Now you will create a Player Object using data 
    // player = Player(playerData) 

    // One you have the player object 
    // create the dictionary where you want to store them 
    var dict: [String: Array<Player>] = [:] 

    // Check which team the player belongs 
    // if player belongs to LAK then add it player array with team key. 

    dict["LAK"].append(player) 

私の質問は、私はそれが同じキーの下のプレーヤーのすべてを保存するために得るのですかですか?

ただ1つのキーの下にプレーヤーを追加する場合は、対応する配列に追加するだけです。 Dictionaryの目的は "Key-Value"のペアを格納することであり、単一のキーを追加するだけで意味がないため、これはお勧めしません。配列を使うほうが良い。

dict["Your Key"].append(player) 
+0

また、私は本当に申し訳ありませんが、コードでコメントを正しく設定する方法がわかりません! (初心者は申し訳ありません) 私は1つの鍵を使用しません。私は各チームの鍵を持っています。 '(FLA ")?. append(" player "、" LAK ")? (filterByTeam(array:players、team: "FLA")) dict ["TBL"]?append(filterByTeam(配列:プレーヤー、チーム: "TBL")) 残念ながら私はまだnilを返しています、私はそれが前と同じようにアソートされた配列にこだわるのが最善だと思っていますか? –

+0

@RyanSandsは 'filterByTeam'メソッドの実装を共有できます。 – Rahul

+0

確かに:)チーム FUNCをfilterByTeamによって '//フィルタアレイ(配列:[プレーヤー]、チーム:文字列) - >アレイ { せfilteredArray = array.filter({$ 0.team ==チーム}) return filteredArray } ' 本当に申し訳ありませんが、コメントにインデントを付けてコードを書式設定する方法がわかりません。 –

1

複数の値を同じキーの下に格納することはできません。それはKey-Valueの記憶の全目的を破っています。 1つのキーは1つの値にマップする必要があります。

代わりにプレイヤーの配列を格納することはできますが、そのような種類の辞書は辞書を使用する目的に反します。

アクセス可能にしたいオブジェクトに固有のキー(識別子)がある場合は、辞書を使用する必要があります。あなたのケースでは、すべてがユニークであれば、そのプレーヤーの名前を使用することができます。

関連する問題