2016-09-28 2 views
2

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을 추가하려고 시도했지만 도움이되지 않았습니다. 여기에 뭐가 잘못 됐는지 말해 줄 수 있어요?

+0

'userHashtags'는 'SingleHashtag'이며 시퀀스가 ​​아닙니다. 아마도 당신은'for userHashtags.hashtagText {'? –

+0

흠 나는 그것을 시도했지만, 이제는 내 메소드 cellForRowAtIndexPath에'let 해시 : SingleHashtag = self.items [indexPath.row]라는 줄이있다! SingleHashtag' 그리고 그것은 오류를 throw합니다. 'NSTaggedPointerString'(0x1a0c44378)의 값을 'SingleHashtag'로 변환 할 수 없으므로 코드에서 구문 분석이 잘못된 지점이 확실하지 않습니다. - – user3766930

+0

데이터가 있다고합니다 배열로,하지만 사전 ({ "hastags": [ "first", "second", "third"]})을 나열했습니다 - 그 사전의 배열을 되 찾을 수 있습니까? 아니면 해시 태그 사전을 얻으시겠습니까? – BJHStudios

답변

2

의견에있는 대화를 토대로 여기에 많은 것들이있는 것처럼 보입니다.

NSMutableArray과 같은 객관적인 개체로 items을 정의하면 타이핑 강도가 느려지고 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로 작성, 그래서 당신은 스위프트의 이전 버전을 사용하는 경우 일부 구문 차이가있을 것입니다.

관련 문제