如何将 swiftyJSON dictionaryValue 用作 UILabel 的可用字符串?

How can I use swiftyJSON dictionaryValue as a usable string for a UILabel?

我在 UITableViewController 中有一个 makeRequest() 方法,代码如下:

    func makeRequest() {

    Alamofire.request(.GET, self.foursquareEndpointURL, parameters: [
        //"VENUE_ID" : self.foursquareVenueID,
            "client_id" : self.foursquareClientID,
            "client_secret" : self.foursquareClientSecret,
            "v" : "20140806"
            ])
        .responseJSON(options: nil) { (_, _, data, error) -> Void in
        if error != nil {
            println(error?.localizedDescription)
        } else if let data: AnyObject = data {
            let jObj = JSON(data)
            if let venue = jObj["response"]["venue"].dictionaryValue as [String: JSON]? {
                self.responseitems = jObj
                println("venue is: \(venue)")
            }
            dispatch_async(dispatch_get_main_queue()) {
                self.tableView.reloadData() // Update UI
            }
        }
    }
}

还要记住我有一个 属性 var responseitems:JSON = []

println("venue is: \(venue)") 向控制台打印一个漂亮的响应,所以我知道它工作正常...

我还有一个自定义的 UITableViewCell class 和 bindData() 方法,代码如下:

func bindData() {
    println("VenueDetailHeaderCell data did set")
    self.venueDetailTitleLabel.text = self.headerInfo?["name"].stringValue
    let labelData = self.headerInfo?["name"].stringValue
    println("labelData is: \(labelData)")
}

如您所见,我正在尝试将 UILabel 的文本设置为 JSON 响应中的 ["name"].stringValue。但是,当我 println("labelData is: \(labelData)") 我得到 labelData 的控制台输出是: Optional("") 这显然是空的。

这是我要抓取的内容的屏幕截图

我在这里做错了什么,我如何获取场地名称并将我的 UILabel 分配给它?

更新:

我尝试了以下代码

let labelData = self.headerInfo?["name"].error
    println("labelData is: \(labelData)")

并获得控制台输出:"Error Domain=SwiftyJSONErrorDomain Code=901 "Array[0] failure, It is not an array" UserInfo=0x7fd6d9f7dc10 {NSLocalizedDescription=Array[0] failure, It is not an array}" 如果对任何人都有用。我在这里真的很困惑...有什么想法吗?

接下来的解析方式

element: JSONValue //Something with JSONValue
if let title = element["name"]?.string {
    cell.title.text = title
}

问题是 headerInfo 值是一个错误 JSON 对象,因为您正在尝试访问具有整数索引的字典。

请注意,var responseitems:JSON = [] 不会创建数组对象。 SwiftyJSON 具有自动赋值构造函数(我是 swift 的新手,所以不确定正确的 swift 术语是什么)...请参阅此初始化程序SwiftyJSON.swift 源代码:

extension JSON: ArrayLiteralConvertible {
    public init(arrayLiteral elements: AnyObject...) {
        self.init(elements)
    }
}

这意味着当您执行 var responseitems:JSON = [] 时,您并不是在创建数组,而是在创建一个 JSON 对象,该对象是使用上述 init 的空数组构造的方法。然后,当您执行 self.responseitems = jObj 时,您会将 responseitems 变量重新分配给一个 JSON 对象,其中包含一个字典。因此self.responseitems[0]无效。

另请注意,对于 SwiftyJSON,不存在可选的 JSON 对象。我注意到在你的评论中你说你做 var headerInfo:JSON? ... - 不可能有一个可选的 JSON.

var headerInfo: JSON = nil

以上是可能的 - 这使用另一个自动初始化器来初始化一个有效的 JSON 对象,该对象表示 JSON 空值。

那么,如何解决呢?

当你分配 headerInfo 时,这样做:

let headerInfo = self.responseitems["response"]["venue"]

现在 bindData 您可以:

self.venueDetailTitleLabel.text = self.headerInfo["name"].stringValue

请注意,以上所有内容均假设 Swift 1.2 且 SwiftyJSON >= 2.2 - 在您理解上述内容并更正问题后,您可能会想要稍微重构代码以反映对数据模型的正确理解。