2017-05-03 45 views
1

我正在將JSON數據轉換爲結構,然後將該結構添加到數組中,但我在訪問結構中的值時遇到問題。如何檢索結構中的值swift

首先我有我的結構:

struct Skill { 
    var name: String 

    init(dictionary: [String: Any]){ 
    name = dictionary["name"] as! String 
    }  
} 

然後在另一個班,我將我的JSON數據到結構並將其添加到一個數組。我可以訪問for循環內的值(即skillDict.name),但我無法從另一個類的數組訪問它們。

var skillArray: NSMutableArray = [] 
fun getJSON(){ 
…. 
if let skill : NSArray = jsonRoot["skills"] as? NSArray 
    { 

     for each in skill{ 
      var skillDict = Skill(dictionary: each as! [String : Any]) 

      skillArray.add(skillDict)  
      } 

    } 

當我運行從另一大類下面的代碼,我得到打印的第一行這樣的錯誤:「這個類不是鍵值編碼兼容的鍵名」。我也嘗試使用第二行打印行正確打印所有我的對象,但我無法訪問名稱值。

for each in skillArray{ 
     print(skillArray.value(forKey: "name")) 
     print(each) //this line will print correctly, so I know the correct data is in the array 

    } 

我也嘗試使用下面的代碼,for循環的內外:

print(skillArray.map { $0["name"] as? String }) 

但我得到一個編譯器錯誤「鍵入任何沒有標會員」

如何正確訪問名稱值?

回答

0

如果聲明skillArray爲:

var skillArray = Array<Skill>() 

那麼這應該工作:

print(each.name) 
+0

這很好地工作。謝謝您的幫助! – Wallboy

+0

不客氣! (不要忘記接受答案) – norders

0

有兩種方法來解決它要麼使[Skill]型,而不是NSMutablearrayskillArray或投$0在地圖功能是Skill型第一的,然後使用基本屬性。

例如,這可能會有所幫助:

print(skillArray.map { ($0 as! Skill).name }) 
+0

此工作就像一個魅力。非常感謝你! – Wallboy

+1

...如果你使用'flatMap {($ 0 as?Skill).name}',它會簡單地跳過強制轉換失敗而不是崩潰的元素 – XML

1

,如果你想使用標鍵isEqual to「name」then return name

struct Skill { 
    var name: String 

    init(dictionary: [String: Any]){ 
     name = dictionary["name"] as! String 
    } 

    subscript(_ name: String) -> String? { 
     get { 
      return name == "name" ? self.name : nil 
     } 
    } 
} 

這種代碼可以使用print(skillArray.map { $0["name"] as? String })工作

0

實例化陣列[技能]:

var skillArray = [Skill]() 
... 
let names = skillArray.map { $0.name }