2016-05-25 5 views
1

私はSwiftを使い慣れました。関数からオブジェクトの配列を返す

GET JSONレスポンスをマップするために使用するクラスは次のとおりです。

class BasketballTeamResponse: Mappable { 
    var name: String? 
    var alias: String? 
    var market: String? 
    var founded: Int? 

    var players: [Players]? 

    required init?(_ map: Map){ } 

    func mapping(map: Map) { 
     name <- map["name"] 
     alias <- map["alias"] 
     market <- map["market"] 
     founded <- map["founded"] 
     players <- map["players"] 
    } 
} 

class Players: Mappable { 
    var full_name: String? 
    var jersey_number: String? 
    var position: String? 

    init(full_name: String, jersey_number: String, position: String) { 
     self.full_name = full_name 
     self.jersey_number = jersey_number 
     self.position = position 
    } 

    required init?(_ map: Map) { } 

    func mapping (map: Map) { 
     full_name <- map["full_name"] 
     jersey_number <- map["jersey_number"] 
     position <- map["position"] 
    } 
} 

のは、私はViewControllerを持っていると私はPlayersのオブジェクトの配列でfinalRosterを投入したいとしましょう。私は自分自身で追加を試してきましたが、finalRosterはまだ空です。これを後でテーブルビューに表示するために使いたいです。私も、私はfinalRosterからgetBasketBallTeamPlayers()からオブジェクトの配列を渡すことができますどのように-> [Players]

class ViewController: UIViewController { 

var finalRoster = [Players]() 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 

    getBasketBallTeamPlayers() 
} 

private func getBasketBallTeamPlayers() { 
    let URL = "http://api.sportradar.us/nba-t3/teams/583ec825-fb46-11e1-82cb-f4ce4684ea4c/profile.json?api_key=xxxxxxxxxxxxxxxxxxxxxxxx" 
    //var pool = [Players]() 
    Alamofire.request(.GET, URL, parameters: nil) 
     .validate() 
     .responseObject { (response: Response<BasketBallTeamResponse, NSError>) in 
      let gswResponse = response.result.value 
      if let roster = gswResponse?.players { 
       for players in roster { 
        print(players.full_name!) 
        print(players.jersey_number!) 
        print(players.position!) 
        let add = Players(full_name: players.full_name!, jersey_number: players.jersey_number!, position: players.position!) 
        self.finalRoster.append(add) 
       } 
      } 
     } 
} 

に戻り値の型を設定しようとしましたか?ありがとう

+2

あなたの 'Players'クラスは単なる' Player'という名前にするべきだと思います。 – jtbandes

答えて

0

jtbandesにコメントがあるので、Playersの代わりにPlayerクラスを呼び出す方がいいです。

typealias apiSuccess = (result: Player?) -> Void 
typealias apiFailure = (error: NSDictionary?) -> Void 

class ViewController: UIViewController { 
    var finalRoster = [Player]() 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

     let myApiSuccess: apiSuccess = {(result: Player?) -> Void in 
      print ("Api Success : result is:\n \(result)") 
      // Here you can make whatever you want with result 
      self.finalRoster.append(result!) 
     } 
     let myApiFailure: apiFailure = {(error: NSDictionary?) -> Void in 
      print ("Api Failure : error is:\n \(error)") 
      // Here you can check the errors with error dictionary looking for http error type or http status code 
     } 
     getBasketBallTeamPlayers(success: myApiSuccess, failure: myApiFailure) 
    } 

    private func getBasketBallTeamPlayers(success successBlock :apiSuccess, 
              failure failureBlock :apiFailure) { 
     let URL = "http://api.sportradar.us/nba-t3/teams/583ec825-fb46-11e1-82cb-f4ce4684ea4c/profile.json?api_key=xxxxxxxxxxxxxxxxxxxxxxxx" 
     //var pool = [Players]() 
     Alamofire.request(.GET, URL, parameters: nil) 
      .validate() 
      .responseObject { (response: Response<BasketBallTeamResponse, NSError>) in 
       if response.result.isSuccess { 
        let gswResponse = response.result.value 
        if let roster = gswResponse?.players { 
         for players in roster { 
          print(players.full_name!) 
          print(players.jersey_number!) 
          print(players.position!) 
          let add = Players(full_name: players.full_name!, jersey_number: players.jersey_number!, position: players.position!) 
          successBlock(result: add) 
         } 
        } else { 
         print("I have some kind of error in my data") 
        } 
       } else { 
        let httpError: NSError = response.result.error! 
        let statusCode = httpError.code 
        let error:NSDictionary = ["error" : httpError,"statusCode" : statusCode] 
        failureBlock(error: error) 
       } 
      } 
     } 
} 
+0

いくつか調査しました。完了ハンドラを追加してリクエストの終了を渡していると思いますか? 'finalRoster'のカウント= 0と'致命的なエラー:インデックスが範囲外です '。私はそれをデバッグしようとしてきたが、役に立たない。それをもう一度見てもらえますか?とても有難い。 – user6379314

+0

私は2つのカスタム補完ハンドラ(成功と失敗)を挿入しました。次に、関数を呼び出してカスタム補完変数を宣言してデータを取得しました。あなたの問題は、あなたのプロパティを初期化する必要があると思います。たとえば、文字列に開始値を指定し、getBasketBallを呼び出した後に配列の次元を確認して配列次元をチェックすると、結果を簡単に処理できます。 –

関連する問題