2016-06-18 12 views
2

私はこのコードをPHPから書き直しています。そして私はそれを迅速に働かせることは難しいと思う。あなたの配列を仮定素早い辞書の値を更新するには

var arrayOfData = [AnyObject]() 

for index in 1...5 { 
    var dict = [String: AnyObject]() 
    dict["data"] = [1,2,3] 
    dict["count"] = 0 

    arrayOfData.append(dict) 
} 

for d in arrayOfData { 

    let data = d as AnyObject 

    // I want to update the "count" value 
    // data["count"] = 8 
    print(data); 
    break; 
} 
+1

なぜオブジェクトが辞書であることがわかっているのですか? – Wain

答えて

5

はおそらく、あなたがdata["count"] = 8を割り当てるときarrayOfDataの内部値を更新します。 NSMutableArrayNSMutableDictionaryに切り替えると、コードは必要に応じて機能します。これがうまくいく理由は、これらの型はSwift配列や辞書などの値型の代わりに参照型なので、コピーを作成するのではなく、内部で値を参照しているためです。

var arrayOfData = NSMutableArray() 

for index in 1...5 { 
    var dict = NSMutableDictionary() 
    dict["data"] = [1,2,3] 
    dict["count"] = 0 

    arrayOfData.addObject(dict) 
} 

for d in arrayOfData { 
    let data = d as! NSMutableDictionary 
    data["count"] = 8 
    print(data) 
    break 
} 
+0

恐ろしい、ありがとう!しかしマップを使用して@SeanCAtkinsonのソリューションと比較してください。いずれかが良いですが、パフォーマンスは – Ben

+0

です。 'map'は' arrayOfData'を再作成します。これは 'arrayOfData'アイテムに直接アクセスして変更するので効率が悪くなります。 – vacawama

+0

はい、あります。そして、 "let data ..."を削除し、 "d"をNSMutableDictionary型にするには? – Ben

3

「[ANYOBJECT]」の形式にする必要があり、このような何か:

var arrayOfData = [AnyObject]() 

for index in 1...5 { 
    var dict = [String: AnyObject]() 
    dict["data"] = [1,2,3] 
    dict["count"] = 0 

    arrayOfData.append(dict) 
} 

for d in arrayOfData { 

    // check d is a dictionary, else continue to the next 
    guard let data = d as? [String: AnyObject] else { continue } 

    data["count"] = 8 
} 

しかし、好ましくは、あなたの配列は辞書の配列として入力されます:

var arrayOfData = [[String: AnyObject]]() 

for index in 1...5 { 
    var dict = [String: AnyObject]() 
    dict["data"] = [1,2,3] 
    dict["count"] = 0 

    arrayOfData.append(dict) 
} 

for d in arrayOfData { 
    // swift knows that d is of type [String: AnyObject] already 
    d["count"] = 8 
} 

編集:

したがって、ループで変更すると、新しいバージョンの配列から辞書を削除し、それを戻す必要があります。マップを使用してみてください:

arrayOfData = arrayOfData.map{ originalDict in 
    var newDict = originalDict 
    newDict["count"] = 8 
    return newDict 
} 
+0

エラー:添字を通じて割り当てることができません:「D」[「カウント」]定数 d「を聞かせて」= 8 – Ben

+0

変更第二のループにある: 正しいarrayOfData – SeanCAtkinson

+0

におけるVAR dの、しかしarrayOfData内のすべての「カウント」まだ0です – Ben

関連する問題