web-dev-qa-db-ja.com

スウィフト、2つの問題。 1)弱い変数2)@IBOutletのbang演算子

あたり:

@IBOutlet weak var nameLabel: UILabel!
  1. IBOutletsを宣言するときはいつでも、weakvarの代わりにvarを使用します。しかし、最近、弱い変数を使用するいくつかのコードテンプレートに出くわしました。なぜ彼らはそれをするのですか?追加のメリットは何ですか?

  2. UILabelの最後にbang演算子があるのはなぜですか。私はそれが必要であることを知っています、そして私はそれと一緒に行きます、しかしただ今それを尋ねます。

前もって感謝します。

20
shle2821
  1. Swift IBOutletはデフォルトで弱いです(ただし、他のプロパティはデフォルトで強いです)。したがって、両方の書き込みは同じです。

弱いものと強いものの違いについての詳細があります ここ

  1. Appleのドキュメント によると

Swiftでアウトレットを宣言するときは、アウトレットのタイプを暗黙的にアンラップされたオプション(!)にする必要があります。このようにして、初期化後、実行時にストーリーボードにアウトレットを接続させることができます。

22
Jérôme Leducq

ビュー要素はビューによって(強く)所有されているため、アウトレットは弱くなります。ビューコントローラにも強力な参照があることは技術的には問題ないと思いますが、必須ではありません。

弱い変数はnilになる可能性があるため、オプションです。代わりに?を使用してアウトレットを宣言できますが、それは毎回強制アンラップまたはオプションのバインディングを使用することを意味します。それらを暗黙的にアンラップされたオプションとして!で宣言することは、単に便利です。

10
gregheo

オブジェクトがスーパービューに残っている限り、オブジェクトへの強い参照があるため、IBOutletsを参照するときはweakを使用します。 IBOutletsの場合は弱いまたは強い を参照してください。次に、bang演算子は、IBOutletが明示的にラップ解除されたラベルであることを示します。 bang演算子を使用すると、オブジェクトが存在することが保証されるため、オブジェクトを参照するときは、次のように簡単に参照できます。

someLabel.text = "some text"

ただし、それらをオプションのIBOutletsにすることができます。

@IBOutlet weak var someLabel: UILabel?

ただし、それらにアクセスするときは?を使用する必要があります

someLabel?.text = "some text"
1
Ian
  1. @gregheoの応答は、さらに詳しく説明するために最もよく説明されています。この状況で所有権を検討する場合、@IBOutletによって参照されるViewオブジェクトは、通常、それを参照するViewControllerによって所有されるべきではありません。

    むしろ、ツリー内のどこにあっても、そのスーパービューが所有する必要があります(これは、UIView.subviewsによって強く発生します)。代わりに、View Controllerは、そのView Treeのルートを強力に所有しています(UIViewController.view)。 weakは、ViewControllerのライフサイクルのさまざまな時点でnilになる可能性のある非所有参照を明示的に宣言します。

  2. ここでは、!を使用する代わりの方法を提供します。暗黙的にラップされていないオプションの参照を使用することは、Swiftが提供するツールを弱める危険な方法です。 XibまたはStoryboardからロードされるViewControllerには、作成されてからViewがロードされるまでの一定の時間が、毎回@IBOutlet参照がnilの場合に含まれます。その間、誰もメンバーを操作しないと想定するということは、Swift文法とコンパイラーのフィードバックを私たちの利益のために使用しないことを意味します。

    さらに、@IBOutletsは、画面またはビューを設計するときに、柔軟で視覚的に焦点を絞ったアプローチを可能にする強力なツールです。 View Controllerが使用されることがわかっているかどうかに関係なく、ViewControllerに利用可能なすべての情報の@IBOutletsを公開させ、ビルドおよび反復時に実際に接続して使用するものを個別に決定するのが一般的な方法です。 InterfaceBuilder内から表示します。

    さらに、ビューをXib/Storyboardおよびコードからインスタンス化するのに十分な柔軟性が必要な場合は、参照されるサブビューをインスタンス化して接続する方法に応じて、すぐに使用できる場合とできない場合があります。

上記の理由で、私は私のものを定義します:@IBOutlet weak var nameLabel: UILabel?

1
yo.ian.g