类型不符合协议序列类型 - Swift

时间:2016-09-28 14:24:04

标签: ios swift uitableview alamofire swifty-json

从我的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,但这没有任何帮助。你能告诉我这里可能有什么问题吗?

1 个答案:

答案 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,会有一些语法差异。