Open5

swift

Tomoki OtaTomoki Ota

カメラアプリを作っていく

$ swift --version
Apple Swift version 5.10 (swiftlang-5.10.0.13 clang-1500.3.9.4)
Target: arm64-apple-darwin23.5.0

プロジェクトの作成

appを選択

カメラアプリ

ImagePickerView.swiftを作成する。

ImagePickerView.swifは以下のように編集

ImagePickerView.swift
- struct ImagePickerView: View {
+ struct ImagePickerView: UIViewControllerRepresentable {
-    var body: some View {
-        Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/)
-    }
}

- #Preview {
-    ImagePickerView()
- }

@Bindingを使って写真撮影をしているかどうかのflagを持つisShowSheet、写真を保存するcaptureImage変数を定義する。?はnilを許容する。

ImagePickerView.swift
struct ImagePickerView: UIViewControllerRepresentable {
+    @Binding var isShowSheet: Bool
+   @Binding var captureImage: UIImage?
}

UIKitのdelegateを使う

delegateを使うためには、Coordinateという機能を用いる。
delegateは処理を完了した時に通知する機能。

Tomoki OtaTomoki Ota

swiftUI v.s. UIKit

  • swiftUI : モダンな技術でシンプルと効率性高
  • UIKit : 古くからある。信頼性や安定性が高い
Tomoki OtaTomoki Ota

以下は古い書き方。

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

これが現在は以下のように簡素化されている。

#Preview {
    ContentView()
}
Tomoki OtaTomoki Ota

@State

SwiftUI によって管理される値を読み書きできるプロパティ。viewの中でしか使えない。

  • 値の更新を監視し、通知が来たら自動でViewを再描画する
  • struct内のプロパティを変更可能にする
struct ContentView: View{
    @State var count: Int = 0

    var body: some View{
        VStack{
            Text(count.description)
            Button("+1する"){
                count += 1
            }
        }
    }
}

@StateObject

struct ContentView: View{
    @StateObject var model = ContentViewModel()

    var body: some View{
        VStack{
            Text(model.count.description)
            Button("+1する"){
                model.count += 1
            }
        }
    }
}

class ContentViewModel: ObservableObject{
    @Published var count = 0
}