类型不符合协议序列类型 - Swift
type does not conform to protocol Sequence Type - Swift
从我的 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 { [=12=].stringValue}
return SingleHashtag(hashtagText: hashtagText)
}
}
然后在我的主要 class 我有:
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
但没有帮助。你能告诉我这里可能出了什么问题吗?
根据我们在评论中的对话,这里似乎有很多事情在起作用。
将 items
定义为像 NSMutableArray
一样的 objective-c 对象是在对抗 Swift 并剥夺了它的打字强度。如果 items
只是一个标签字符串列表,那么它应该这样输入。尝试将您的项目声明更改为:
var items = [String]()
根据您分享的内容,SingleHashtag
似乎也不需要单独的 class。如果它只有一个 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.
的旧版本,将会存在一些语法差异
从我的 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 { [=12=].stringValue}
return SingleHashtag(hashtagText: hashtagText)
}
}
然后在我的主要 class 我有:
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
但没有帮助。你能告诉我这里可能出了什么问题吗?
根据我们在评论中的对话,这里似乎有很多事情在起作用。
将 items
定义为像 NSMutableArray
一样的 objective-c 对象是在对抗 Swift 并剥夺了它的打字强度。如果 items
只是一个标签字符串列表,那么它应该这样输入。尝试将您的项目声明更改为:
var items = [String]()
根据您分享的内容,SingleHashtag
似乎也不需要单独的 class。如果它只有一个 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.
的旧版本,将会存在一些语法差异