Swift 16 Swift 概要

>  driven ?
: operated, moved, or controlled by a specified person or source of power.
         : (of a person) relentlessly compelled by the need to accomplish a goal; very hard-working and ambitious.
~ Old English drīfan ‘urge (a person or animal) to go forward’, of Germanic origin; related to Dutch drijven and German treiben .
         
2019年で初めて紹介されたSwiftUIは開発過程でもlive preveiw機能を利用して、リアルタイムでテストできるようにします。
Swiftの長所は宣言的な`Syntax`とデータドリブンに基で始まります。
> declare ?
:say something in a solemn and emphatic manner.
~ de- ‘thoroughly’ + clarare ‘make clear’ (from clarus ‘clear’).

# 16.1 UIkitと interface Builder 
Swiftの宣言的な`syntax`についた意味と長所を理解すると、使用者interface layoutがSwiftUi 以前にはどうやって設計されるかを先に探すことがいいです。　
SWUI以前にはIOS SDK(Sowftware develop kit)を構成する複数のframeworkと一緒にUiKitを使ってIOSアフリを開発しました。

アフリの海面を構成する使用者InterfaceLayoutを設計する様にXcodeにはinterfaceBuilderと言う道具が含まれています。此れはアフリを構成する別々の仮面を盛り込んだStoryBoardを生成できる様にします。
![Screenshot 2023-10-31 at 4.06.54 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/7cca3f37-342a-8245-6c59-9377d4391d58.png)

一つの仮面を構成するUserInterfaceLayoutはInterfaceBuilderの中で構築されて、LibraryPannelでbutton,Label,TextField,SliderなどとComponentをドラッグして仮面の缶ばにキャンバスに落ちる方法でした。仮面で配置されたComponentを選択するとInspectorPannelを通じてComponentのPropertyを変えることもできました。

仮面のlayoutがDevice仮面の大きいさによってどう変わるのか、そしてデーバイスの方向についてどう変わるのかは各Componentが画面の大きいさと他のComponentの関係についてどのサイズでどこに置くべきかを司るのはConstraintで決まります。
最後で、buttonとSliderみたいで使用者イベントで返事するべきなComponentは該当イベントを処理するアフリsourceCodeの`method()`と遠結されます。

その様な開発過程の多様な段階では全てのことが予想通りに動作するかどうかを確認するためsimulatorとか
deviceでアフリをcompileして実行すルべく事もある。
![Screenshot 2023-10-31 at 4.05.43 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/e3cdc3f3-60fc-1314-3ff8-34998248dee3.png)

# 16.2　SwiftUIの宣言的な `Syntax`
UIkitとInterfaceBuilderを使用してIntFaceLayoutを設計して必要な動作を実装するのとは違う方法である宣言的な`syntax`がSwiftUIで導入されました。仮面を構成するComponentなどとLayoutと模様についた複雑な詳細情報を直接に設計する代わりに、SwiftUIは単純ながらて直感的な `Syntax`を使って場面を記述できるようにします。

この過程で基本的にlayoutで含まれるComponentを宣言すると、これたちが含まれるlayoutManager種類(Vstack, Form, List)を明示して、property(buttonのtext, labelのforegroundColor, tab gestureでeventの時で呼び出される`method()`)を設定する為にModfierを使います。
![Screenshot 2023-10-31 at 4.31.23 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/184fe198-89fe-6674-d3cb-ff872a03bb81.png)

あとではlayoutPostion, constraint, rendering方法に対する複雑な詳細情報はSwiftUIが自動的に処理します。
> constrain :
? severely restrict the scope, extent, or activity of.
~ constraindre, from Latin constringere ‘bind tightly together’.

![two_different_sized_views_2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/77843c41-b0f9-960a-db2b-d8b5fb6cf9eb.png)

> render : 
? provide or give / ause to be or become; make. / represent or depict artistically.
~ Latin reddere ‘give back’, from re- ‘back’ + dare ‘give’. ‘translate’, and ‘give back’ 

![Screenshot 2023-10-31 at 4.55.17 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/06b0705b-0a18-82d9-bc24-e4c875d8236f.png)
SwiftUI宣言Cascasde様に構成されています。従って再利用ができる使用者定義SubViewと共に構成すると複雑なViewを簡単に生成できます。

ViewLayOutが宣言されて、テストされている間にXcodeで提供されるPreveiwCanvasを通じて![Screenshot 2023-10-31 at 5.14.28 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/8f00cf87-de1e-82e0-dc2d-8b59f6efa800.png)
リアルタイムで変更されるlayoutを確認することができます。

# 16.3 SwiftUIはデータ主導型である
SwiftUIはアフリのデータモデルとUserInterfaceComponent,Binding( connects a property to a source of truth stored elsewhere, instead of storing data directly) する様々な方法でSourceCodeの複雑度を解決します。
![Screenshot 2023-10-31 at 5.28.34 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/50bed34e-e42c-b594-3ddc-7d949bbb17d3.png)
データ主導的に実装するとデータモデルのアフリの他の部分でsubscribeできるデータの変数をpublishするになります。この様な方法を通じてデータが変更されだと事実を全てのSubscriberに自動的に知らせることができます。もしuserInterfaceComponentとDataModel間の`Binding`が追加されると、コードを作成しなくても、全てのデータ変更事項をSWiftUIがUserInterfaceで自動的に反映するはずです。

# 16.4 SwiftUI vs. UIKit
以前のバージョンをIOSを使うデーバイスフロジャートでは無ければ、可能な限りSwiftUIを使う事がいいです。でも地図とかウェブビューを統合する必要がある式の特定の機能はまだUIKitを使わなければなりません。さらに、とっても複雑なuserInterfaceLayooutを設計する時にはinterfaceBuilderを使用する必要があるかもしれません。

# 要約
SwiftUIは UserInterfaceRenderingを直接的に実装する事ではなく、宣言的な`syntax`で使用者Interface宣言してアフリが実行される時にRenderingを実行最先の方法を決めるため全ての作業をします。また、SwiftUIはデータの変化がアフリの動作と模様を主導するという点で、此れはPublisherとsubscriberモデルを通じて