【问题标题】:swift iterate on array快速迭代数组
【发布时间】:2015-06-15 16:10:11
【问题描述】:

我想请求一些帮助。

我有一个调用 web 服务并从中获取 json 对象的方法。

看起来像这样:

 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 不是数组,这是行哪里抛出异常:

let finalDate = finalFormatter.stringFromDate(dateShow!)

它正在等待可选,但由于此行导致它为零:

let dateShow : NSDate? = v["feedDate"].asDate

这就是我的 json 只有一个元素时的样子:

{"bkkKallerFeedTst":{"feedRouteShName":"143","id":"348","feedLat":"47.5998971180592","feedImgType":"3","feedDate":"2015-06-15T14:07:30+02:00","feedLon":"19.0457082953807","feedText":"Itthon :)”}}

这就是当它有多个元素时的样子(现在它有两个元素)

{"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 :)"}]}

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

非常感谢!

通过答案我创建了这个:

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)

}

现在它正在打印:

[feedImgType: 3, feedRouteShName: 143, feedLat: 47.5998971180592, feedText: Itthon :), feedLon: 19.0457082953807, id: 348, feedDate: 2015-06-15T14:07:30+02:00]

更新:这是解决方案..

 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))

        }

【问题讨论】:

  • 你能用一行陈述你的问题吗?
  • 我的问题是如果我的 json 对象只有一个节点,如何迭代它..
  • key:value 对的数量与迭代无关。所以不管是1还是10都无所谓,都是一样的逻辑
  • 您使用的是哪个 JSON API? (或者 JSON 类的子类是什么?)
  • 顺便说一句,你声明dateShow :NSDate 是可选的,你能验证它是一个有效的对象吗?你正在解开它,但它说它为零。这是一个很大的提示

标签: json swift for-loop


【解决方案1】:

最好首先定义 JSON 对象,以便它生成一个具有单个值的数组,而不是这种方式,否则您可以检查您是否获得了有效的日期,如果您不尝试它是另一种方式。

但是看看你使用的 API,这里是https://github.com/dankogai/swift-json,你似乎可以检查你得到的是字典还是数组。因此,为了清楚起见,我会使用“.isDictionary”方法将字典值转换为明确类型的变量。

例如类似于

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

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

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

然后您可以先遍历数组(对于 bkkKallerFeedTstArray 中的 ?),然后遍历包含的字典内部(就像您之前所做的那样)

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

代码示例:

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))

    }

}

【讨论】:

  • 谢谢,但我不是想获取 Date 或任何东西.. let dateShow : NSDate? = v["feedDate"].asDate 它可以是任何其他字符串,等等。因为名为 v 的数组不存在.. 检查我的问题中的两个 json.. 当我在数据库中有一行时,我的 java 后端将像这样创建 json: {"bkkKallerFeedTst":{.... 但是如果数据库有超过一行,我的 json 将是一个数组: {"bkkKallerFeedTst":[{... 当我的 json 时我的代码工作正常有更多的行..因为 v 数组将存在。抱歉,我无法更好地描述我的问题。
  • 我完全理解 - 你遇到的问题是当你访问 json["bkkKallerFeedTst"] - 它不知道它是数组还是字典。您需要确保它始终是一个数组 - 这样您就可以统一处理所有内容。我会尝试将您的代码合并到答案中 - 试试看,可能会有错误,所以请随时编辑。
  • 谢谢你,请检查我更新的问题..我试图创建你在回答中写的内容..
  • 用你更新的答案它仍然在同一行抛出异常:(请检查我更新的问题.. :)
  • 我想我在你的帮助下解决了.. :) 检查我更新的问题。有了这个: println(feed["feedRouteShName"]) 它正在打印 Optional(143) 现在我必须将它转换为 Sring .. :)
猜你喜欢
  • 2015-12-12
  • 2018-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-19
  • 2021-04-26
  • 1970-01-01
相关资源
最近更新 更多