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

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

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

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

Q&A

解決済

1回答

1738閲覧

swift 計算型プロパティ

tosi_1211

総合スコア138

Swift

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

0グッド

1クリップ

投稿2016/07/01 08:49

UI部品の設置などの時に、

① 計算型プロパティ
let baseImageView: UIImageView = {
let imageView = UIImageView()
imageView.frame = CGRect(x: 0, y: 0, width: UIScreen.fullScreenWidth(), height: UIScreen.fullScreenHeight() / 2)
imageView.contentMode = UIViewContentMode.ScaleAspectFill
imageView.image = UIImage(named: "")
return imageView
}()

②メソッド

func setImageView() {
let imageView = UIImageView()
imageView.frame = CGRect(x: 0, y: 0, width: UIScreen.fullScreenWidth(), height: UIScreen.fullScreenHeight() / 2)
imageView.contentMode = UIViewContentMode.ScaleAspectFill
imageView.image = UIImage(named: "")
self.addsubView(imageView)
}

①と②どっちで実装するのが良いのでしょうか?
自分は一つのメソッドを作って実装していたのですが、海外のコードなどを見ると①をよく見かけます。

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

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

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

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

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

guest

回答1

0

ベストアンサー

① 計算型プロパティ

①は 保存型プロパティです、計算型プロパティにletを指定することはできないと怒られます。

私も①の書き方を使用します、メリットとしては宣言した後に処理を記述するので可読性が良いというのがあると思います。
※最近の書き方はブロックを記述してその後の処理(非同期の戻りなど)を実行することが増えています。

メソッドで同じ事をやろうとすると、メソッドを作成して呼び出さなくてならなくて、呼び出しを忘れると初期値が設定されないことになります。

swift

1// 保存型プロパティ: クロージャーを即時実行して戻りを返す 2// ※何度読んでも、ブロックの中は1度しか実行されません。 3 4let baseImageView: UIImageView = { 5 let imageView = UIImageView() 6 imageView.frame = CGRect(x: 0, y: 0, width: 50, height: 50) 7 imageView.contentMode = .ScaleAspectFit 8 imageView.image = UIImage(named: "swift") 9 return imageView 10}() 11 12// Usage 13view.addSubview(baseImageView)

swift

1// 保存型プロパティ 2let imageView = UIImageView() 3 4// インスタンスメソッドでオブジェクトを返す 5func setImageView() -> UIImageView { 6 imageView.frame = CGRect(x: 0, y: 0, width: 50, height: 50) 7 imageView.contentMode = .ScaleAspectFit 8 imageView.image = UIImage(named: "swift") 9 return imageView 10} 11 12// Usage 13view.addSubview(setImageView())

Storyboardで作成する場合は以下のように書くこともできます。
※初期値を設定するのが分かりやすいのでお勧めです。

swift

1@IBOutlet weak var imageView1: UIImageView! { 2 didSet { 3 imageView1.contentMode = .ScaleAspectFit 4 imageView1.image = UIImage(named: "swift") 5 } 6}
  • 追記

こちらが分かりやすかったです。

【Swift】Initialization ClosureでviewDidLoadの肥大化を防ぐ

投稿2016/07/02 14:55

編集2016/07/05 23:32
_Kentarou

総合スコア8490

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

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

tosi_1211

2016/07/02 15:02

①は保存型プロパティだったのですね。 メソッドのメリットは引数をもたせて、複数ユニークなオブジェクトを生成できることですか?
tosi_1211

2016/07/02 15:10

いままでメソッドでやってきたので、少し興味を持てました。 >メソッドのメリットは引数をもたせて、複数ユニークなオブジェクトを生成できることですか? これについてはどうでしょうか?
_Kentarou

2016/07/02 15:22 編集

今回のコードはオブジェクトの初期値を設定するのに、どのような違いがあるのかという事を記載したので、 「複数ユニークなオブジェクトを生成できる」という様なことはまた別の話だと思います。 「複数ユニークなオブジェクトを生成する」という話でしたら、メソッドのメリットでは無く、明らかにメソッドでやるべきだと考えます。
_Kentarou

2016/07/02 15:34

そもそも①と②のコードは呼び出す回数によって動きが違うので、単純に比較はできません。ですので回答に書いたコードは同じ動きになる様に変更して比較しています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問