首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在数组上快速迭代

在数组上快速迭代
EN

Stack Overflow用户
提问于 2015-06-15 16:10:11
回答 1查看 110关注 0票数 0

我想请你帮帮忙。

我有一个方法,它调用一个webservice并从中获取一个json对象。

看起来是这样的:

代码语言:javascript
运行
复制
 func wsServiceFeedTst()  {
        println("WS called...")
        println("tstFrames count: " + tstFrames.count.description)

        let json = JSON(url:"http://79.172.249.175:7001/RestWebServiceApp/webresources/entity.bkkkallerfeedtst")

        println(json)

        for (k, v) in json["bkkKallerFeedTst"] {

            let dateShow : NSDate? = v["feedDate"].asDate
            var finalFormatter = NSDateFormatter()
            finalFormatter.dateFormat = "yyyy.MM.dd - HH:mm"
            let finalDate = finalFormatter.stringFromDate(dateShow!)

            tstFrames.append(TimeFrame(text: v["feedText"].description, date: finalDate, image: nil, routeName: v["feedRouteShName"].description, postId: v["id"].description,routType: v["feedImgType"].description))

        }

    }

在得到json之后,我尝试迭代它并尝试将json的节点添加到另一个数组中,但是当json只包含一个元素时,它失败了,因为我的json不是一个数组,这是它抛出异常的行:

代码语言:javascript
运行
复制
let finalDate = finalFormatter.stringFromDate(dateShow!)

它正在等待可选选项,但它由以下行导致的值为零:

代码语言:javascript
运行
复制
let dateShow : NSDate? = v["feedDate"].asDate

当我的json只有一个元素时,它就是这样的:

代码语言:javascript
运行
复制
{"bkkKallerFeedTst":{"feedRouteShName":"143","id":"348","feedLat":"47.5998971180592","feedImgType":"3","feedDate":"2015-06-15T14:07:30+02:00","feedLon":"19.0457082953807","feedText":"Itthon :)”}}

这就是当它有超过一个元素时的样子(现在它有两个元素)。

代码语言:javascript
运行
复制
{"bkkKallerFeedTst":[{"feedRouteShName":"H5","id":"349","feedLat":"47.5535475845461","feedImgType":"2","feedDate":"2015-06-15T15:27:02+02:00","feedLon":"19.0458004338391","feedText":"Hév ;)"},{"feedRouteShName":"143","id":"348","feedLat":"47.5998971180592","feedImgType":"3","feedDate":"2015-06-15T14:07:30+02:00","feedLon":"19.0457082953807","feedText":"Itthon :)"}]}

有没有人知道如何解决这个问题?

非常感谢!

根据答案,我创建了以下内容:

代码语言:javascript
运行
复制
var bkkKallerFeedTst = json["bkkKallerFeedTst"]
var bkkKallerFeedTstArray : [[NSObject : AnyObject]]
bkkKallerFeedTstArray = []
if bkkKallerFeedTst.isDictionary {

    bkkKallerFeedTstArray.append(bkkKallerFeedTst.asDictionary!)
} else {

}

for feed in bkkKallerFeedTstArray {
    println(feed["feedRouteShName"]) //now its printing: Optional(143)

}

现在它打印这个:

代码语言:javascript
运行
复制
[feedImgType: 3, feedRouteShName: 143, feedLat: 47.5998971180592, feedText: Itthon :), feedLon: 19.0457082953807, id: 348, feedDate: 2015-06-15T14:07:30+02:00]

更新:这是解决方案。

代码语言:javascript
运行
复制
 var bkkKallerFeedTst = json["bkkKallerFeedTst"]
        var bkkKallerFeedTstArray : [JSON]

        if bkkKallerFeedTst.isDictionary {
            bkkKallerFeedTstArray = [bkkKallerFeedTst] //initialize
        } else {
            bkkKallerFeedTstArray = bkkKallerFeedTst.asArray!
        }

        for bkk in bkkKallerFeedTstArray {

            let dateShow : NSDate = bkk["feedDate"].asDate!
            var finalFormatter = NSDateFormatter()
            finalFormatter.dateFormat = "yyyy.MM.dd - HH:mm"
            let finalDate = finalFormatter.stringFromDate(dateShow)

            tstFrames.append(TimeFrame(text: bkk["feedText"].description, date: finalDate, image: nil, routeName: bkk["feedRouteShName"].description, postId: bkk["id"].description,routType: bkk["feedImgType"].description))

        }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-15 16:40:27

最好最初定义JSON对象,这样它就会生成一个具有单个值的数组,而不是这样,但否则您可以检查是否获得有效日期,如果不尝试其他方式,则检查它是否有效。

但是,看看您使用过的API,在这里https://github.com/dankogai/swift-json,您似乎可以进行检查,以确定您是得到字典还是数组。因此,为了清晰起见,我会使用'.isDictionary‘方法将二分法值转换为一个明确类型的变量。

例如,类似于

代码语言:javascript
运行
复制
var bkkKallerFeedTst = json["bkkKallerFeedTst"]
var bkkKallerFeedTstArray : [JSON]  

if bkkKallerFeedTst.isDictionary {
    bkkKallerFeedTstArray = [bkkKallerFeedTst] //initialize
} else {
    bkkKallerFeedTstArray = bkkKallerFeedTst.asArray
}

可能不是这个确切的代码-我没有api。

然后,您可以首先遍历数组(for?(在bkkKallerFeedTstArray中),然后通过包含的字典(就像之前所做的那样)

基本上,在执行操作之前,首先要确保您有一个字典数组。

使用代码的示例:

代码语言:javascript
运行
复制
func wsServiceFeedTst()  {
    println("WS called...")
    println("tstFrames count: " + tstFrames.count.description)

    let json = JSON(url:"http://79.172.249.175:7001/RestWebServiceApp/webresources/entity.bkkkallerfeedtst")

    println(json)

    var bkkKallerFeedTst = json["bkkKallerFeedTst"]
    var bkkKallerFeedTstArray : [JSON]

    if bkkKallerFeedTst.isDictionary {
        bkkKallerFeedTstArray = [bkkKallerFeedTst] //initialize
    } else {
        bkkKallerFeedTstArray = bkkKallerFeedTst.asArray
    }

    for bkk in bkkKallerFeedTstArray {

        let dateShow : NSDate = bkk["feedDate"].asDate!
        var finalFormatter = NSDateFormatter()
        finalFormatter.dateFormat = "yyyy.MM.dd - HH:mm"
        let finalDate = finalFormatter.stringFromDate(dateShow)

        tstFrames.append(TimeFrame(text: v["feedText"].description, date: finalDate, image: nil, routeName: v["feedRouteShName"].description, postId: v["id"].description,routType: v["feedImgType"].description))

    }

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30849958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档