2016-09-28 65 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,因此,如果您使用的是雨燕的舊版本會有一些語法差異。

相關問題