2014-09-12 80 views
0

我試圖理解爲什麼迪科[ 「入場券」]是[任何]類型不是:斯威夫特字典

import Foundation 

var array: [Any]! 

let dico: [String: Any] = ["tickets": [["itemLines": [["name": "kebab", "units": 1], ["name": "muffin", "units": 1], ["name": "coca-cola", "units": 2]]]], "totale": 225.00] 


if let tickets = dico["tickets"] as? [Any] { 
    array = tickets 
} 

println(array) 

(Xcode的6 GM)

任何線索?

回答

2

不要使用Any除非你絕對必須。在這種情況下推理它非常棘手。 Swift有類型參數化(泛型)的原因。在大多數情況下,你仍然需要一個結構體。

我試圖寫出這個東西的類型實際上是什麼,但是在Swift中寫入是不可能的。第二個元素是[String:Float],這很好。但第一個元素是[String:[[String: Any]]],這是一種Swift不會暗示提升的類型(並且碰巧是一種非常瘋狂的類型)。如果你明確地要求它到達你想要的位置,Swift只會提升到Any。這就是爲什麼它不會在這裏悄悄推銷到[Any]。這是一個功能。否則,各種各樣的東西會悄悄地推向Any,編譯器錯誤會更加混亂。

答案是爲了避免Any。你真正在這裏有幾個結構:

struct Item { 
    let name: String 
    let units: Int 
} 

struct Dico { 
    let tickets: [Item] 
    let totale: Float 
} 

let dico = Dico(tickets: [ 
    Item(name: "kebab", units: 1), 
    Item(name: "muffin", units: 1), 
    Item(name: "coca-cola", units: 2) 
    ], 
    totale: 225.00) 

let tickets = dico.tickets 

這是你應該如何存儲和處理你的數據。如果你開始使用類似JSON的東西來返回一堆Any對象,那麼在使用它之前,應該將它解析爲數據結構。否則,你會與這個瘋狂的字典在整個代碼中戰鬥。我一直在寫關於Swift中的JSON解析的系列文章,這些系列以Functional Wish Fulfillment開頭。我鏈接到其他幾種類似的方法。相同的基本技術適用於任何解析器,而不僅僅是JSON。

+0

我幾乎明白了!我在這裏嘗試的是在使用靜態數據在網絡/ JSON部分工作之前構建我的視圖。謝謝,我會看看你的關於JSON解析的鏈接。 – Alak 2014-09-12 15:25:35