質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.62%

  • Swift

    7008questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

SwiftのTableViewの構造を教えて下さい!

受付中

回答 3

投稿

  • 評価
  • クリップ 3
  • VIEW 1,811
プログラミングを始めてまだ間もないです。なので基礎的な質問ですが、教えてくれる嬉しいです!


class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    
    // Tableで使用する配列を設定する
    private let myItems: NSArray = ["TEST1", "TEST2", "TEST3"]
    private var myTableView: UITableView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Status Barの高さを取得する.
        let barHeight: CGFloat = UIApplication.sharedApplication().statusBarFrame.size.height
        
        // Viewの高さと幅を取得する.
        let displayWidth: CGFloat = self.view.frame.width
        let displayHeight: CGFloat = self.view.frame.height
        
        // TableViewの生成する(status barの高さ分ずらして表示).
        myTableView = UITableView(frame: CGRect(x: 0, y: barHeight, width: displayWidth, height: displayHeight - barHeight))
        
        // Cell名の登録をおこなう.
        myTableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "MyCell")
        
        // DataSourceの設定をする.
        myTableView.dataSource = self
        
        // Delegateを設定する.
        myTableView.delegate = self
        
        // Viewに追加する.
        self.view.addSubview(myTableView)
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    
    /*
    Cellが選択された際に呼び出されるデリゲートメソッド.
    */
    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        println("Num: \(indexPath.row)")
        println("Value: \(myItems[indexPath.row])")
    }
    
    /*
    Cellの総数を返すデータソースメソッド.
    (実装必須)
    */
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return myItems.count
    }
    
    /*
    Cellに値を設定するデータソースメソッド.
    (実装必須)
    */
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        
        // 再利用するCellを取得する.
        let cell = tableView.dequeueReusableCellWithIdentifier("MyCell", forIndexPath: indexPath) as! UITableViewCell
        
        // Cellに値を設定する.
        cell.textLabel!.text = "\(myItems[indexPath.row])"
        
        return cell
    }
    
}
というコードを(https://sites.google.com/a/gclue.jp/swift-docs/ni-yinki100-ios/uikit/006-uitableviewdeteburuwo-biao-shi)から書き写しました。

このコードなのですが、 func tableView(){}というメソッドが3つあるのですが、何故同じ名前のメソッドが3つあるのでしょうか??
この3つはどのような構造になっているのでしょうか??

基本的なクラス構造が分かっていないです。
教えていただけると嬉しいです。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+1

なぜ同じメソッド名がStripeさんのおっしゃるとおりで引数や返り値が異なる(シグニチャが異なる)と別関数扱いになります。

UITableViewの基本的な動きについてはプログラマーが実装しなくても動くようになっており、カスタマイズできる部分だけ実装すれば良いようになっています。

例えば下記の部分はreturnする値を変えればTableViewの動きが変わりますよね。これはおそらく初期化のときに呼ばれています。
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return myItems.count
    }

下記ではセルが選択されたタイミングで呼び出され、その際の処理を記述することができます
    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        println("Num: \(indexPath.row)")
        println("Value: \(myItems[indexPath.row])")
    }

このように「どんな部分をカスタマイズできて、そのカスタマイズした部分がどのタイミングで呼ばれるか」を知ることがUITableViewの構造を知るための近道だと思います。

なお、どこをカスタマイズできるのかという指定が
<UITableViewDelegate, UITableViewDataSource>
のところです。

ここの部分を「プロトコル」というのですが
このプロトコルで指定された特定のメソッドの中身を実装すれば、そこの部分だけプログラマが自由に動きを変えられますよということです。

具体的にどんなメソッドを実装しなければならないかはプロトコルのところ(例えば<UITableViewDelegate>)の部分に「command」を押しながらカーソルを当ててクリックするとUITableViewDelegateの中身を見ることができます。

ここから先はご自身で調べてみてください^^/

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

それは、いわゆるひとつの関数オーバーロードです。
引数のラベルや型がそれぞれ異なるので、それらは異なる関数です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

このコードなのですが、 func tableView(){}というメソッドが3つあるのですが、何故同じ名前のメソッドが3つあるのでしょうか?? 
この3つはどのような構造になっているのでしょうか?? 

iOSの画面を作ってるライブラリ(UIKit)のビューは基本的に、ViewとViewDelegateとViewDataSourceという3つの構成になっています

今回の例で言うと、ViewがUITableView、ViewDelegateがUITableViewDelegate、ViewDataSourceがUITableViewDataSourceですね

これらを構成的に分類をすると以下のようになります

クラス
UITableView

プロトコル
UITableViewDelegate
UITableViewDataSource

この関係性を一目で理解できる箇所が書いて頂いたコードのこの部分になるのですが

        // DataSourceの設定をする.
        myTableView.dataSource = self
        
        // Delegateを設定する.
        myTableView.delegate = self

これは主様が作られたUITableViewのUITableViewDelegateとUITableViewDataSourceに対して、テーブルビューのイベントを私に教えて下さい、というお願いをしているわけです

試しにこの部分をコメントアウトすることでテーブルビューに何も表示されなくなることが分かると思います

このコードなのですが、 func tableView(){}というメソッドが3つあるのですが、何故同じ名前のメソッドが3つあるのでしょうか?? 

これは他の回答者も言ってるようにSwiftのオーバーロードという言語機能のおかげで同じメソッド名のtableView(){}が存在できるわけです。

ただしパラメータの()の中を見ると全部中身が違うので厳密にはこの3つのメソッドはそれぞれ違うという扱いになるんですね

なんでこういう作りになってるかというと、Objective-Cの頃の名残の設計パターンがそのままSwiftにも来てるのと、操作したいViewとイベントのやり取りをしたいときに毎回どうやって表示するかの処理を書かなくてすむように最低限これだけ設定すれば動くよっていうメソッドをプロトコル(Delegate、DataSource)が提供してくれてるわけです

以下の部分ですね

    /*
    Cellが選択された際に呼び出されるデリゲートメソッド.
    */
    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        println("Num: \(indexPath.row)")
        println("Value: \(myItems[indexPath.row])")
    }
    
    /*
    Cellの総数を返すデータソースメソッド.
    (実装必須)
    */
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return myItems.count
    }
    
    /*
    Cellに値を設定するデータソースメソッド.
    (実装必須)
    */
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        
        // 再利用するCellを取得する.
        let cell = tableView.dequeueReusableCellWithIdentifier("MyCell", forIndexPath: indexPath) as! UITableViewCell
        
        // Cellに値を設定する.
        cell.textLabel!.text = "\(myItems[indexPath.row])"
        
        return cell
    }
    
}


投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Swift

    7008questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています