类型不符合协议序列类型 - 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.

的旧版本,将会存在一些语法差异