Swift 17 SwiftUI モードでXcode使用する

新しいプロジェクトを生成するとXcodeはプロジェクトで使用するuserInterfaceをStoryBoard基して生成するか、それともSwiftUI基してするかを選択権を提供します。SwiftUIプロジェクトを生成するとXcodeはUIKitStoryBoardモードには全然違う方法のuserInterface設計環境を提供します。

SwiftUIモードで作業するとアプリ開発者である皆様の時間大部分をコードEditorとPreviewCanvasで費やすことになります。

# 17.1 Xcode14 始める
Xcodeを始める実行すると、'Show this window when Xcode launches'を消していない場合　Window > Welcome to Xcode メニュウを選択しましょう
![Screenshot 2023-11-01 at 9.39.37 AM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/a2af99f9-f152-61e3-52cf-657209b374ad.png)

# 17.2 SwiftUI プロジェクト生成する
新しいプロジェクト生成するときテンプリット画面にはアプリプロジェクトを実装する方法を選択するオプションが表示されます。特定ApplePlatformアプリを作るとか、multiPlatformプロジェクトを生成するオプションを使う事ができます。platform別オプションを選択するとStoryBoard または　SwiftUI基盤プロジェクトを生成する事もできます。

Multiplatformプロジェクト使用するとflatform別コードを最小限にして様々なApplePlatform用アプリで設計する事もできます。最初はIOSだけを対象にする予定でもMulti Platformオプションをプロジェクトを再構成しなくても今後方のplatformでアプリを
使うできる様にする柔軟性を提供するMultiplatformをお勧めます。

基本アプリ、文章基盤あアプリまたはゲームプロジェクトを作るのに使用するtempleteもあiります。
![Screenshot 2023-11-01 at 10.23.14 AM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/f09d5410-eeb6-e94a-f53b-f9c8c3ff7064.png)
Nextを押すとプロジェクト名前を入力必要があるProjectOption画面が表示されます。
Organization Identifierは普段会社ウェブサイトのURLを逆にする事です。此れは実際デバイスでIOS高級機能をテストされる様にProvisioning profileおよびauthenticationを生成するときに使用されまする。またアプリ掲載されるとき Apple App Store内でアプリを識別させる役目もします。
>  Provisioning profile デバイスでアプリを実行するためには、私のデバイスが開発者を信頼できるかどうかを知る必要があり、アプリのインストールを許可するかどうかを決めることができますが、この決定を助けるファイルがプロビジョニングプロファイルです。
![Screenshot 2023-11-01 at 10.49.39 AM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/9ed29dcb-b24a-a7de-5a63-a8b6f2bbe60e.png)
# 17.3 SwiftUIモードXcode
新しく生成されたmultiPlatform　'App'プロジェクトには<appname>Demo.swiftとContentView.swiftと言う二つのSwiftUIビューファイルが含めれており、プロジェクトNavigation Pannelで選択すると
![Screenshot 2023-11-01 at 11.12.25 AM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/424e901a-6a8c-75d8-0f42-aa5f48f4cdbe.png)
プロジェクトが始めてロードされる時にはXcodeはdefaultでアプリをbuildしてテストするため対象platformでMacOsを使用する事ができます。続行する前にRun DestinationChooserを使用してIPhoneを選択しましょう
![Screenshot 2023-11-01 at 11.17.04 AM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/78d3090f-5ae2-068b-0d64-87441fee4649.png)

PreviewCanvas中であるViewを選択するとCodeEditorで該当する部分が自動的に選択されて、強調形で表現されます。逆にコードEditorであるコードを選択するとCanvasであるViewが選択されます。
現在選択された項目propertyはAtrributeInspectorPannelで表示されます。
![Screenshot 2023-11-01 at 11.30.29 AM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/bf208db3-7658-c363-019f-9a4bba40c111.png)
Debugg中なのでDebuggPannelで IOS Frameworkと皆様がコードに含ませたprint Syntax内容が出力されますもしConsoleが表示されない場合はDebbug分割Pannelの
![Screenshot 2023-11-01 at 11.37.25 AM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/77ff2010-5f8e-b987-6e40-028b11f1a20e.png)
それをclickしましょう。　此れはVariable View(Left) , Console View(Right) 二つ全部を表示できる様にしています。Variable Viewはアプリが衝突するとかDebugging BreakPointに到達する地点からアプリ内の変数を表示されます。反面、Console Viewは実行するアプリの出力結果とMessageが表示されます。
MinimapではMousePointerを合わせると該当位置のClass, Property または機能を表すLabelが表示します。
Mouseをを持っている間Commandを押ていると次の様にSourceFileの中で含まれた要素が表示されます。
![Screenshot 2023-11-01 at 1.19.45 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/93cbd598-5e3c-2494-8b0f-27e21036e287.png)

# 17.4　Preview Canvas
此れはuserInterface設計に対する視覚的な表示と共にlayout内でViewを追加するとか修正する道具を提供します。また、此れはIOS Simulatorを実行しなくてもアプリをテストする様にします。
![Screenshot 2023-11-01 at 1.27.03 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/3d7c828f-4172-2dec-0a74-2110fd5ca8d6.png)
# 17.5 Preview 固定する
Xcodeでアフリを作るときにデフォルトで生成されるソラ未開ContentView.swift file以外にも複数の SwiftUI View filewで構成する事もできます。プロジェクトNavigatorPannelでSwiftUIファイルを選択するとコードエディタでと`Preview Canvas`が現在選ばれたファイルの内容で変更される様です。どどに方のSwiftUIファイルのコードを修正する間にも特定SwiftUIファイルのuserInterfaceLayoutが表示されていたい時があります。特に依存関係のレイアウトであったり他のviewで含まれたLayoutの場合にそうなる。
![Screenshot 2023-11-01 at 2.04.57 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/56f02dc6-3483-e79d-d19b-062c276815a4.png)
Pin Buttonは他のViewファイルを選択しても現在のpreviewをCanvasで固定して表示される様にします。preview上段にあるViewButtonをclickして固定されたView間を切り替えます。
# 17.6 画面設計修正する
SwiftUI作業には基本的に他のviewを追加するためにModifierを利用してViewを修正、Logicを追加して状態と他のデータObjectをBindingする事が含まれています。その様な作業全てはコードeditorでStructを修正する方法で進行します。例え、'Hello World'Text Viewを表現するfontEditorはEditor内で適度なModifierを追加いて変更する事ができます。
```swift
Text("Hello, world")
.font(.largeTitle)
```
方の方法ではLibraryPannelで欲しい項目を探してSwiftUI ViewでDragandDropして変更することです。
![Screenshot 2023-11-01 at 2.39.54 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/7a082fb7-c403-c8e9-5e28-555a94755d16.png)
この方法をで使用うすると一度使用する後でPannelが消えてしまいます。でも、optionKeyを押すてLibrary buttonをclickすると消えてしまいません。

Library Pannelで中央上部にあるふくすうのiconは　modifier, snippet, image, color resourceなどとカテゴリーに切り替える方法で使用されます。

LibraryからPreviewCanvasで項目をDragAndDropする事もできます。

この例題でButtonViewをTextView下で置こうとするとpreviewと既存のTextViewは自動的にVerticalStack ContainerViewに追加されると言うお知らせが表示されるであろう

ViewまたはModifierをSwiftUIViewFileで追加したらforegroundColorModifierを使用してカラーを指定してみよう。簡単にはEditorを修正する事です。
```swift
Text("Hello world")
    .foregroundColor(.red)
```
他の方法ではeditorまたはpreviewPanelで該当View選んだ後でattributeInspector Pannelでforeground colorを変更する事です。
![Screenshot 2023-11-01 at 3.52.12 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/b8a1ec94-53ac-ffce-de14-1b6bc9c87e52.png)
addModifierを通じて`Modifier`を追加することもできます。このメニュウの中で現在ViewTypeで使用できるModifierが表示されます。
![Screenshot 2023-11-01 at 4.04.41 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/63f94b9a-2d5e-ec93-0b6d-bcb3eaec33bd.png)
# 17.8 editor Context　メニュウ
Commandを押したままコードエディターの項目をclickすると
![Screenshot 2023-11-01 at 4.16.37 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/61a0cbb7-8717-24f0-a885-a5a7289b6fbb.png)
選択した項目のターフによって変わるメニュウを提供します。一般的には現在viewに対するAttribute InspectorのPopUpバージョンで、shortcut optionとStackとListContainerにある現在viewを含むoptionが含まれます。此れは自身で属するsubViewであるviewを抽出するためにも有用です。subViewを生成することは再利用性を高めながら、性能を改善して、複雑な設計構成を綺麗いな様にお奨めています。

# 17.9 複数のデバイスでプレビュー
新しいくて生成されたSwiftUI Viewファイルは次のように宣言部が含まれています。
```swift
struct PreViewProvider : PreviewProvider {
    Static var previews: some View {
    ContentView()
    }
}
```
PreviewProvider Protocolを従うこの`Struct{}`はファイルで基本となるViewのInstanceを`↑ return`します。これまXcodeがpreviewCanvasで該当のViewをプレビューを表示する様に指示することでこのような宣言がなければCanvasには何も現れないだろう。

Defaultで、PreviewCanvasはXcode Toolbarでplay/Stopbutton 右にあるTarget Menuで現在選択された単一のデバイス基盤のuserInterfaceを見せてあげます。
![Screenshot 2023-11-01 at 5.18.00 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/7f0c82a2-7145-54d1-1415-135017d8b86f.png)
ここで他のデバイスわ指定することもできますけどデバイスが指定される様にpreview structを修正する事でする
```swift
struct SwiftUIView: PreviewProvider {
    static var previews : some View {
        ContentView()
            .previewDevice("iPhone SE (2nd generation)")
            .previewDisplayName("iPhone SE")
    }
}
```
次の様にGroupViewでGroupingして複数のデバイスで同時にPreviewする事ができます。
```swift
struct ContentView_Previews: PreviewProvider {
    static var previews : some View {
        Group{
            ContentView()
                .previewDevice("iphon13")
                .previewDisplayName("iphon13")
            ContentView()
                .previewDevice("iPhone SE (2nd generation)")
                .previewDisplayName("iPhone SE")
        }
    }
}
```
複数のデバイスでpreviewすると次の様にpreviewPannel上段にあるbuttonを使っで変更する事ができます。
![Screenshot 2023-11-01 at 5.38.34 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/a27c44ca-2abf-2665-789e-fb9257d58f2c.png)
enviroment modifierは他の構成でLayoutPreviewする事でも使う事ができます。例えば、ダークモードのpreview為のコードです。
```swift
 ContentView()
                .preferredColorScheme(.dark)
                .previewDevice("iPhone SE (2nd generation)")
```
preview structは canvasにあるViewでSample Dataを伝達してテストするにも有用です。

# 17.11実際IOSデバイスでアプリ実行する
simulator環境は多様なIOSデバイスモーデルでアフリをテストする事ができる有用な事ですけど、実際IOSデバイスでテストする事も大事です。

もし、皆様が｀アフリ開発者プログラム加入するで説明した様にXcodeの設定画面でApple IDを入力しプロジェクトに対して開チームを選択した場合、開発用マックシステムとUSBCableで連結された実際デバイスでアフリを実行する事もできます。

開発システムとデバイスを連結された状態でアプリをテストする準備ができたらXcode toolbarであるデバイスメニュウを使います。もしかしてIOS Simulator 構成の一つがDefaultで設定されるかもしれない。このメニュウを選択して実際デバイスで変更しましょう。

# 17.12　デバイスとシミュレーター管理する
現在IOSデバイスとXcodeで使用する様に構成すされたシミュレーターはXcodeのデバイス画面で表示・管理することができる。
![Screenshot 2023-11-02 at 10.18.19 AM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/a46f652a-7684-c045-eeb1-5608fc6078c7.png)

# 17.13 ネットワークテスト活性化する
USBCableを連結してネットワーク連結を通じするテストも支援します。
![Screenshot 2023-11-02 at 10.49.23 AM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/6d2f3104-917a-b6f0-2f98-75b63c84db9b.png)
無線でアプリを実行するターゲットとして使用することが可能です。ただ同じWIFIを連結されている事です。

# 17.14 build error処理する
![Screenshot 2023-11-02 at 11.03.16 AM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/4e5b7946-691c-7fd2-6347-0d559ec23afc.png)

# 17.15 アフリ性能モニタリング
LivePreviewCanvaseで実行しているアプリの性能をモニタリングする事ができます。この情報はDebugNavigaorを通じて見る事ができます。

![Screenshot 2023-11-02 at 11.10.51 AM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/e2f3c78c-e172-845c-ef2c-f1f76899f9a3.png)
これらのカテゴリーのいずれかを選択すると選択されたアフリの性能に対する追加情報が提供されます。
![Screenshot 2023-11-02 at 11.14.39 AM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/97ec0fc9-6829-e31c-4b40-6da4a77e222b.png)

# 17.16　使用者InterfaceLayout階層構造見てみる
XcodeはuserInterfaceLayoutを回転して見る事ができる3次元ビューで分離する機能を提供します。これを通じてuserInterfaceのView階層構造がどうやって構築されるかを確認する事ができます。
また、SwiftUIがどのぐらいしてくれるかを確認します。
![Screenshot 2023-11-02 at 11.29.54 AM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/6eb2e626-a0f5-c02d-5387-9b8cbfd4b252.png)
階層構造をdebugginする間に左のPannelでは
![Screenshot 2023-11-02 at 11.32.44 AM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/fa9b1e4d-b0c4-1b8d-e2df-d645cae1e116.png)
layoutに対する全体のView階層構造が表示されます。

# 要約　
新しいプロジェクト生成するとXcodeはアプリのuserInterfaceを作る時にUIkitStoryBoardを利用するとか、それともSwiftUIを使用するかを決定できるoptionをあげます。
previewCanvasはCodeEditorで変更されたコードがリアルタイムで反映できるように画面をupdateする様です。だが大きいな変更についてはUpadateがどどに一時停止されます。
Attribute Inspectorでは選択されたView propertyを変更して新しい修正者を追加するようにします。Commandを押したままEditorとCanvasViewをclickすると多様なContextMenuが表示されます。