2016-09-28 61 views
2

从我的swift应用程序我从Web服务提取数据。 数据来自一个数组:类型不符合协议序列类型 - 斯威夫特

{"hashtags": ["first", "second"]} 

我希望把每一个包括hashtag我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) 
    } 
} 

,然后在我的主I类有:

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

'userHashtags'是一个'SingleHashtag',这不是一个序列。也许你的意思是'用于hashHashtags.hashtagText {'? –

+0

嗯,我试过了,但现在在我的方法cellForRowAtIndexPath我有一行'让哈希:SingleHashtag = self.items [indexPath.row]为! SingleHashtag'并且它会抛出一个错误无法将类型'NSTaggedPointerString'(0x1a0c44378)的值转换为'SingleHashtag',所以我不确定在我的代码中解析的哪一点是错误的... - – user3766930

+0

你说数据来作为一个数组,但你列出了一个字典({“hastags”:[“first”,“second”,“third”]}) - 你得到这些字典的数组吗?或者你只是得到hashtags字典? – BJHStudios

回答

2

根据我们在评论中的对话,看起来这里有很多东西在玩。

items定义为像NSMutableArray这样的客观c对象正在与Swift战斗并抢夺它的打字强度。如果items只是一个哈希标签字符串列表,那么它应该像这样键入。试着改变你的项目申报到这一点:

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) 
     } 
} 

注:这是写在斯威夫特3,因此,如果您使用的是雨燕的旧版本会有一些语法差异。

相关问题