結構理論的にはわかっているが、いざソースを書いてみるとかなりハマる。
オプショナル型の制約を熟知していないと、むしろ面倒でバグを誘発するのではないか?
とりあえず、Qiitaに記載する前のドラフト版のソースコード。
エラーが発生しないように、エラーを避けるようなコードを記述しているので結構不安。
MyTableViewController.swift
[scala]
import UIKit
struct Game {
init(){}
var seasonId:String?
var gameName:String?
var gameType:String?
var homeTeamName:String?
var awayTeamName:String?
var homeTeamScore: String?
var awayTeamScore: String?
}
class MyTableViewController: UITableViewController {
required init(coder aDecoder: NSCoder) {
self.gameData = Game()
super.init(coder: aDecoder)
}
var gameData:Game
override func viewDidLoad() {
super.viewDidLoad()
//リクエストデータ取得
let manager:AFHTTPRequestOperationManager = AFHTTPRequestOperationManager()
let serializer:AFJSONRequestSerializer = AFJSONRequestSerializer()
manager.requestSerializer = serializer
manager.GET("http://score-sheet.herokuapp.com/api/games/latest.json", parameters: nil,
success: {(operation: AFHTTPRequestOperation!, responsObject: AnyObject!) in
let responsDict = responsObject as Dictionary<String, AnyObject>
//値取得
var seasonId:Int = (responsDict["season_id"] as AnyObject?) as Int
var gameName:String = (responsDict["game_name"] as AnyObject?) as String
var gameType:Dictionary = (responsDict["game_type"] as AnyObject?) as Dictionary<String, AnyObject>
var gameTypeName:String = (gameType["game_type"] as AnyObject?) as String
var homeTeam:Dictionary = (responsDict["home_team"] as AnyObject?) as Dictionary<String, AnyObject>
var awayTeam:Dictionary = (responsDict["away_team"] as AnyObject?) as Dictionary<String, AnyObject>
var homeTeamName:String = (homeTeam["team_name"] as AnyObject?) as String
var awayTeamName:String = (awayTeam["team_name"] as AnyObject?) as String
var homeTeamScore = (responsDict["home_team_score"] as AnyObject?) as Int
var awayTeamScore = (responsDict["away_team_score"] as AnyObject?) as Int
//取得データ設定
self.gameData.seasonId = String(seasonId)
self.gameData.gameName = gameName
self.gameData.gameType = gameTypeName
self.gameData.homeTeamName = homeTeamName
self.gameData.awayTeamName = awayTeamName
self.gameData.homeTeamScore = String(homeTeamScore)
self.gameData.awayTeamScore = String(awayTeamScore)
//データリロード
self.tableView.reloadData()
//テーブルビュー作成
let tableView = MyTableView(frame: self.view.frame, style: UITableViewStyle.Plain)
tableView.delegate = self
tableView.dataSource = self
self.view.addSubview(tableView)
//セル設定
let xib = UINib(nibName: "MyTableViewCell", bundle: nil)
tableView.registerNib(xib, forCellReuseIdentifier: "BfCell")
},
failure: {(operation: AFHTTPRequestOperation!, error: NSError!) in
println("Error!!")
}
)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// MARK: – Table view data source
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
// #warning Potentially incomplete method implementation.
// Return the number of sections.
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete method implementation.
// Return the number of rows in the section.
return 5
}
//セルデータ設定
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("BfCell", forIndexPath: indexPath) as MyTableViewCell
cell.seasonId?.text = self.gameData.seasonId
cell.gameName?.text = self.gameData.gameName
cell.gameType?.text = self.gameData.gameType
cell.homeTeamName?.text = self.gameData.homeTeamName
cell.awayTeamName?.text = self.gameData.awayTeamName
cell.homeTeamScore?.text = self.gameData.homeTeamScore
cell.awayTeamScore?.text = self.gameData.awayTeamScore
return cell
}
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
//let cell = tableView.dequeueReusableCellWithIdentifier("BfCell") as UITableViewCell
//return cell.bounds.height
return 100
}
/*
// Override to support conditional editing of the table view.
override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
// Return NO if you do not want the specified item to be editable.
return true
}
*/
/*
// Override to support editing the table view.
override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
if editingStyle == .Delete {
// Delete the row from the data source
tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
} else if editingStyle == .Insert {
// Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
}
}
*/
/*
// Override to support rearranging the table view.
override func tableView(tableView: UITableView, moveRowAtIndexPath fromIndexPath: NSIndexPath, toIndexPath: NSIndexPath) {
}
*/
/*
// Override to support conditional rearranging of the table view.
override func tableView(tableView: UITableView, canMoveRowAtIndexPath indexPath: NSIndexPath) -> Bool {
// Return NO if you do not want the item to be re-orderable.
return true
}
*/
/*
// MARK: – Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
}
[/scala]