dav*_*bii 6 xcode swift alamofire swifty-json
我的头会爆炸:) - 我一直试图从我的服务器获取一个JSON字符串到一个字典值,我无法让它工作.
我想要(从我的服务器 - 这是动态的,我希望我的应用程序能够在需要时从服务器提取新数据):
{"1":"Location 1","2":"Location 2","3":"Location 3"}
Run Code Online (Sandbox Code Playgroud)
使用Swift在Xcode中使用这个词典:
var labels = [
1 : "Location 1",
2 : "Location 2",
3 : "Location 3"
]
Run Code Online (Sandbox Code Playgroud)
这必须非常直接,但对于我的生活,我无法弄明白......
这是我的Swift - 我可以从服务器获取信息,但是我不能把它放到像我需要的字典中
var postEndpoint: String = "http://www.myserver.net/app/campus.php"
Alamofire.request(.GET, postEndpoint)
.responseJSON { (request, response, data, error) in
if let anError = error
{
println("error")
println(error)
}
else if let data: AnyObject = data
{
let post = JSON(data)
println(post)
}
}
Run Code Online (Sandbox Code Playgroud)
这导致:
{
"1" : "Location 1",
"2" : "Location 2",
"3" : "Location 3"
}
Run Code Online (Sandbox Code Playgroud)
我正在使用它的最终结果是具有以下代码的iBeacon实现:
let knownBeacons = beacons.filter{ $0.proximity != CLProximity.Unknown }
if (knownBeacons.count > 0) {
let closestBeacon = knownBeacons[0] as CLBeacon
let locationID = post[closestBeacon.minor.integerValue]
self.locationLabel.text = locationID
self.view.backgroundColor = self.colors[closestBeacon.minor.integerValue]
}
Run Code Online (Sandbox Code Playgroud)
我得到的错误是在self.locationLabel.text = locationID'JSON'不能转换为'String',我在使用静态var标签字典时没有收到此错误.我是否试图从服务器获取错误的数据?我究竟做错了什么???我认为具有未声明类型的var标签允许Swift找出它需要什么,我如何从JSON部分做同样的事情?
哦,你太近了!
你的问题是你的post字典是一个[String: String]而不是[Int: String]你认为的字典.您有几种方法可以解决它,但现在最简单的方法就是执行以下操作:
let locationID = post[String(closestBeacon.minor.integerValue)]!
Run Code Online (Sandbox Code Playgroud)
虽然这肯定会有效,但更好的解决方案是将您post转换为[Int: String]类型化的字典,就像您在responseJSON闭包中所期望的那样.这是如何工作的.
let json = JSON(data)
var post = [Int: String]()
for (key, object) in json {
post[key.toInt()!] = object.stringValue
}
Run Code Online (Sandbox Code Playgroud)
你可能希望增加一些安全性,如果key或者object不能分别转换为Int或String分别做什么,但我会留给你.
如果[String: String]对任何人都足够,他/她可以尝试以下代码:
let responseString = "{\"1\":\"Location 1\",\"2\":\"Location 2\",\"3\":\"Location 3\"}"
if let dataFromString = responseString.data(using: String.Encoding.utf8, allowLossyConversion: false) {
let json = JSON(data: dataFromString)
var labels = json.dictionaryObject! as! [String: String]
print(labels)
}
Run Code Online (Sandbox Code Playgroud)
结果是:
["2": "Location 2", "1": "Location 1", "3": "Location 3"].
| 归档时间: |
|
| 查看次数: |
14447 次 |
| 最近记录: |