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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

1回答

764閲覧

クラスのインスタンス化

komekome0101

総合スコア14

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2021/04/08 08:59

とある動画でライン風アプリを作成する勉強をしてるのですが
わからないところがあります。①の部分です。
ChatInputAccessaroyViewクラス型の変数chatInputAccesoryViewを宣言して
その中でlet view = ChatInputAccessaroyView() <-??
return view  <-?? 

これらは一体何をやっているのでしょうか。
また、②に()がついてるのはどういう構文で調べたら出てきますか?

swift

1import UIKit 2 3class ChatRoomViewController: UIViewController{ 4 5 private let cellId = "cellId" 6 7  ① 8 private var chatInputAccesoryView: ChatInputAccessaroyView = { 9 let view = ChatInputAccessaroyView() 10 view.frame = .init(x: 0, y: 0, width: view.frame.width, height: 100) 11 return view 12 }() <-13 14 @IBOutlet weak var chatRoomTableView: UITableView! 15 override func viewDidLoad() { 16 super.viewDidLoad() 17 18 chatRoomTableView.delegate = self 19 chatRoomTableView.dataSource = self 20 //chatRoomTableView.register(UITableViewCell.self, forCellReuseIdentifier: cellId) 21 chatRoomTableView.register(UINib(nibName: "ChatRoomTableViewCell", bundle: nil), forCellReuseIdentifier: cellId) 22 23 chatRoomTableView.backgroundColor = .rgb(red: 110, green: 140, blue: 180) 24 25 } 26} 27 28extension ChatRoomViewController: UITableViewDelegate,UITableViewDataSource{ 29 30 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 31 chatRoomTableView.estimatedRowHeight = 20 32 return UITableView.automaticDimension 33 34 } 35 36 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 37 return 10 38 } 39 40 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 41 let cell = chatRoomTableView.dequeueReusableCell(withIdentifier: cellId, for:indexPath) 42 return cell 43 } 44 45 46} 47

swift

1import UIKit 2 3class ChatInputAccessaroyView: UIView{ 4 5 override init(frame: CGRect) { 6 super.init(frame: frame) 7 8 nibInit() 9 } 10 11 private func nibInit(){ 12 let nib = UINib(nibName: "ChatInputAccessoryView", bundle: nil) 13 guard let view = nib.instantiate(withOwner: self, options: nil).first as? UIView else {return} 14 15 16 view.frame = self.bounds 17 view.autoresizingMask = [.flexibleHeight, .flexibleWidth] 18 self.addSubview(view) 19 } 20 21 required init?(coder: NSCoder) { 22 fatalError("init(coder:) has not been implemented") 23 } 24}

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ChatRoomViewControllerのインスタンスが宣言された時点で、
ChatInputAccessaroyView型のプロパティ、chatInputAccesoryViewが、即時で生成される、
といったことをしています。
()は、ブロックの中の構文を即時実行する、という挙動になります。
ブロックの中でreturnをさせていますが、即時実行とすることによって、
代入先に、returnさせたものを代入させることができます。

ではなぜそのようなことをしているのかというと、
ブロックの中で、ChatInputAccessaroyView型インスタンスの生成と、
そのframeを決めていることに着目してください。
こうすることによって、
ChatRoomViewControllerのインスタンスが宣言された時点で、
固定のframeを持ったChatInputAccessaroyView型オブジェクトを自動的に宣言できる、
って挙動になるため、
改めて、そのChatInputAccessaroyView型のオブジェクトの大きさ(と、それ自体)を定義する必要がなくなるからです。

このように、今回の構文は、後々に再定義が必要ないようなオブジェクトの宣言に対して、非常に効率的な定義構文と言えるでしょう。

また、ChatRoomViewControllerは、UIViewControllerを継承していることにも着目してください。
UIViewControllerは、インスタンス生成のプロセスが、他のクラスと比較しても少々特殊なので、
initメソッドをオーバーライドした上で、正常に動作させるのは、少々厄介です。
よって、プロパティ宣言時に、即時で実体をもつように構文を組んでいるのかと。
initメソッドを増やす、またはオーバーライドして、そちらが使用されるように簡単にできるのであれば、そのinit内で、chatInputAccesoryViewにインスタンスを代入し、frameなどを決めればいいため、今回のような組み方はしなくてもできる)

投稿2021/04/08 09:26

編集2021/04/08 09:34
miyabi_takatsuk

総合スコア9555

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問