ぜのぜ

しりとりしようぜのぜのぜのぜ

282日目

日記

親から野菜とか果物とかが届いた。今日は買い物の日だったのでついでに色々かってきてなんやかんや作った。大量に料理すると気持ちがいい。鍋が足りない。

今日書いたコード

wip: センサーの設定画面をガチャガチャやっている · Gurrium/Komusou@d2de62c · GitHub

感想

手癖で~Viewと~ViewStateを作ってきたけどStateなのか??と思った。~ViewFunctionalityとか~ViewLogicの方が適切なのでは?

純粋にロジックだけが書いてあるならObservableObjectに適合する必要はないけどそうすると破綻したので他の役割も持っていそう。ということはFunctionalityやLogicも適切ではなさそう。と思ってガチャガチャやっていたらロジックだけにできたので全部Viewに移した。このときSensorSettingViewの問題は?

struct SensorSettingView: View {
    @State
    var isSpeedSensorSheetPresented = false

    @AppStorage("speed_sensor_uuid") private var speedSensorUUIDString: String?

    var speedSensorName: String {
        guard let string = speedSensorUUIDString,
              let uuid = UUID(uuidString: string),
              let peripheral = BluetoothManager.shared.connectedPeripherals[uuid],
              let name = peripheral.name else {
            return ""
        }

        return name
    }

    var body: some View {
        List {
            Row(
                isSheetPresented: $isSpeedSensorSheetPresented,
                itemLabel: "スピードセンサー",
                valueLabel: speedSensorName
            ) {
                SensorSelectingView()
            }
            // TODO: ケイデンスセンサー
        }
        .listStyle(.insetGrouped)
    }

    private struct Row<Content: View>: View {
        @Binding
        var isSheetPresented: Bool
        let itemLabel: String
        let valueLabel: String
        @ViewBuilder
        let sheetContent: () -> Content

        var body: some View {
            Button {
                isSheetPresented = true
            } label: {
                HStack {
                    Text(itemLabel)
                    Spacer()
                    Text(valueLabel)
                        .foregroundColor(.secondary)
                }
            }
            .sheet(isPresented: $isSheetPresented, content: sheetContent)
            .tint(.primary)
        }
    }
}