从我的swift
应用中,我从网络服务中获取数据。
数据以数组形式出现:
{"hashtags": ["first", "second"]}
我想将每个#标签放在UITableView
的单独一行中。我有逻辑做到这一点,但首先 - 我在解析数据时遇到了错误的错误。
我写了一个自定义函数:
class SingleHashtag: NSObject {
var hashtagText: [String]
init(hashtagText: [String]) {
self.hashtagText = hashtagText
super.init()
}
class func fromJSON(json: JSON) -> SingleHashtag? {
let hashtagText:[String] = json["hashtags"].arrayValue.map { $0.stringValue}
return SingleHashtag(hashtagText: hashtagText)
}
}
然后在我的主要课程中我有:
Alamofire.request(.GET, "\(serverURL)/hashtags"/*, headers: headers*/)
.validate()
.responseJSON { response in
print(response.description)
switch response.result {
case .Success:
dispatch_async(dispatch_get_main_queue(),{
self.items.removeAllObjects()
if let jsonData = response.result.value as? [[String: AnyObject]] {
for hashtag in jsonData {
if let userHashtags = SingleHashtag.fromJSON(JSON(hashtag)){
for hash in userHashtags {
self.items.addObject(hash)
self.hashtagTable.reloadData()
}
}
}
}
self.hashtagTable.reloadData()
})
case .Failure(let error):
print(error)
}
}
但是这一行:
for hash in userHashtags {
在编译期间抛出错误:
type SingleHashtag does not conform to protocol 'SequenceType'
我尝试添加as AnyObject
,但这没有任何帮助。你能告诉我这里可能有什么问题吗?
答案 0 :(得分:3)
根据我们在评论中的对话,看起来有很多事情在这里发挥作用。
将items
定义为像NSMutableArray
这样的Objective-c对象,正在与Swift作斗争并抢夺它的打字强度。如果items
只是一个hashtag字符串列表,那么它应该这样输入。尝试将您的商品声明更改为:
var items = [String]()
根据您分享的内容,它看起来不像SingleHashtag
的单独类。如果它只有一个String
变量,那么直接将字符串传递给项目会更简单。这方面的一个例子是:
Alamofire.request(.GET, "\(serverURL)/hashtags"/*, headers: headers*/)
.validate()
.responseJSON { response in
print(response.description)
switch response.result {
case .Success:
dispatch_async(dispatch_get_main_queue(),{
self.items.removeAll()
//cast the jsonData appropriately, then grab the hashtags
if let jsonData = response.result.value as? [String: [String]],
let hashtags = jsonData["hashtags"] {
//hashtags is now type [String], so you can loop
//through without the error and add the strings to 'items'
for hashtagText in hashtags {
self.items.append(hashtagText)
self.hashtagTable.reloadData
}
}
})
case .Failure(let error):
print(error)
}
}
注意:这是用Swift 3编写的,因此如果你使用的是旧版本的Swift,会有一些语法差异。