2014-08-28 44 views
2

在Swift中幫助我選擇地獄。如何返回鍵「R」的數組數量。 self.jsonObj可以爲空在Swift中可選,返回數組的數量

func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int { 
    return (self.jsonObj["R"]! as? NSArray)?.count; 
} 
+0

雨燕語言應該很容易不是嗎? – 2014-08-28 04:49:12

+0

應該是,除非我知道它很好 – 2014-08-28 11:32:05

回答

9

讓我們在這一次一步。

self.jsonObj可能nil,所以你需要把它當作一個可選:

self.jsonObj?["R"]

,這樣就會將返回1)nil如果self.jsonObjnil或者「R」是不是一個有效的密鑰,或者與「R」關聯的值是nil 2)某種類型的可選包裝對象。換句話說,你有一個可選的某種未知類型。

下一步是找出它是否是一個NSArray

(self.jsonObj?["R"] as? NSArray)

這將返回一個可選NSArray?類型可能是nil針對上述原因或nil因爲self.jsonObj的目標是一些其他的對象類型。

所以,現在你有一個可選的NSArray,解開它,如果你能,並呼籲count

(self.jsonObj?["R"] as? NSArray)?.count

這將調用數,如果有一個NSArray或因上述原因而返回零。換句話說,現在你有一個Int?

最後,你可以使用零合併運算如果你有nil在這一點上返回值或零:

(self.jsonObj?["R"] as? NSArray)?.count ?? 0

+1

好的答案,但也是一個很好的例子,你應該把你的JSON解析爲真正的Swift數據類型,而不是將其存儲爲'[String:AnyObject]'。不斷檢查你的元素是否是你期望的類型是麻煩且容易出錯的。當數據顯示時做一次。 – 2014-08-28 12:55:06

+0

爲什麼這不起作用? 'NSLog(「%@」,(self.jsonObj?[「R」]!as?NSArray)?)' – 2014-08-28 19:36:24

+0

也'(self.jsonObj?[「R」] as?NSArray)?[0] .count + (self.jsonObj?[「R」] as?NSArray)?[1] .count ?? 0'無法編譯 – 2014-08-28 19:44:30

2

我猜你會想返回0如果沒有什麼在數組中。在這種情況下,嘗試Nil Coalescing Operator

return (self.jsonObj?["R"] as? NSArray)?.count ?? 0; 

編輯:作爲@ vacawama的回答指出,應該self.jsonObj?["R"],而不是self.jsonObj["R"]!萬一self.jsonObjnil

+0

我得到'unexpedly found nil' – 2014-08-28 11:31:25

+0

'return(self.jsonObj?[「R」]!as?NSArray)?。 0;'作品 – 2014-08-28 11:59:47

+2

請記住,'!'應該發音爲「我發誓我的節目的生活。」所以你必須在這裏絕對肯定的是,如果存在'jsonObj',那麼'R'值就不可能丟失(並且很難保證JSON,因爲你通常從程序外部獲取它)。在這種情況下,@ vacawama的解決方案避免了崩潰。 – 2014-08-28 12:58:42

0

假設self.jsonObjNSDictionary?Dictionary<String, AnyObject>?

return self.jsonObj?["R"]?.count ?? 0 
+0

我不相信這會編譯,因爲'AnyObject'上沒有'count'。 – 2014-08-28 13:00:46

+0

@RobNapier「你也可以調用任何Objective-C方法並訪問任何屬性,而不用轉換成更具體的類類型。」[doc](https://developer.apple.com/library/prerelease/mac/documentation/) Swift/Conceptual/BuildingCocoaApps/InteractingWithObjective-CAPIs.html) – 2014-08-28 21:45:40

+0

謝謝;這是有道理的,因爲'AnyObject'基本上轉換爲'id'。這意味着如果這個元素是某種東西,但不是'NSArray',它會崩潰,對吧? – 2014-08-29 11:19:27