28446


XcodeのStoryboardで

パーツと接続するとき

[code]

    @IBOutlet weak var tableView: UITableView!
    
[/code]

という一行があってこれがインスタンスだということまでは  
わかったのですがインスタンスは

[code]

    @IBOutlet weak var tableView: UITableView! = UITableView()
    
[/code]

としないといけないのではないでしょうか？  
自分で調べていく中で最初は`nil`が入っているから  
のような説明を見つけたのですがイマイチ理解できません。


CC BY-SA 3.0
2016-08-23T06:10:51.843
28444
2016-08-23T06:28:56.000
2016-08-23T06:17:25.157
5519
18539
question
swift xcode
@IBOutlet weak var tableView: UITableView! ＝UITableView() ではないのか？


`@IBOutlet`を使わない場合は、おっしゃる通り初期値として

[code]

    var tableView: UITableView! = UITableView()
    
[/code]

のようにインスタンスを生成して`tableView`に代入するか（この場合`weak`を外さないと生成した直後に解放されてしまいます）、あるいは、

[code]

    var tableView: UITableView!
    
[/code]

としておいて、どこか別のところ（例えば`viewDidLoad()`など）で

[code]

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView = UITableView()
    
[/code]

のようにインスタンスを生成して、`tableView`に代入する必要があります。

それぞれの違いは、単にインスタンス変数の定義と同時にインスタンスを生成して代入するか、インスタンスの生成と代入を後で別のところで行うか、ということです。

一方で、`@IBOutlet`を指定するということは、このインスタンス変数とStoryboard（またはXIB）ファイルのコンポーネントを接続するということを示します。`@IBOutlet`を用いて、StoryboardやXIBファイルのコンポーネントがインスタンス変数に接続されているとき、Storyboardをロードした際に、フレームワークが自動的に接続された`@IBOutlet`の変数にStoryboardからオブジェクトを取り出してインスタンスを設定します（StoryboardやXIBファイルにはオブジェクトがアーカイブされて格納されています）。

つまり、上記のように手作業にて`tableView =
UITableView()`のように書いている部分をフレームワークが自動的に行ってくれているので、自分でインスタンスを生成する（`tableView =
UITableView()`のようにする）必要はないということになります。


CC BY-SA 3.0
2016-08-23T06:28:56.000
28446
2016-08-23T06:28:56.000
5519
28444
answer