【SwiftUI】iOS と macOS で互換したいコードの一つの解法

なるほどこうするのか。

iOS ↔ macOS と切り替えると、

ビルドで落ちて萎えるときの

一つの何かのきっかけに。

最新の SwiftUI ならシンプルです。


import SwiftUI

public extension Color {

    #if os(macOS)
    static let background = Color(NSColor.windowBackgroundColor)
    static let secondaryBackground = Color(NSColor.underPageBackgroundColor)
    static let tertiaryBackground = Color(NSColor.controlBackgroundColor)
    #else
    static let background = Color(UIColor.systemBackground)
    static let secondaryBackground = Color(UIColor.secondarySystemBackground)
    static let tertiaryBackground = Color(UIColor.tertiarySystemBackground)
    #endif
}

👉 ios - SwiftUI: Get the Dynamic Background Color (Dark Mode or Light Mode) - Stack Overflow hatena-bookmark

マルチなプラットフォーム作成時には、押さえておきたい記述です。



【Swift】少数の丸め方あれこれ - rounded()

こんなにあったのですか。


5.2
.rounded() 5.0
.rounded(.down) 5.0
.rounded(.up) 6.0
.rounded(.towardZero) 5.0
.rounded(.awayFromZero) 6.0
.rounded(.toNearestOrEven) 5.0
.rounded(.toNearestOrAwayFromZero) 5.0

5.5
.rounded() 6.0
.rounded(.down) 5.0
.rounded(.up) 6.0
.rounded(.towardZero) 5.0
.rounded(.awayFromZero) 6.0
.rounded(.toNearestOrEven) 6.0
.rounded(.toNearestOrAwayFromZero) 6.0

-5.2
.rounded() -5.0
.rounded(.down) -6.0
.rounded(.up) -5.0
.rounded(.towardZero) -5.0
.rounded(.awayFromZero) -6.0
.rounded(.toNearestOrEven) -5.0
.rounded(.toNearestOrAwayFromZero) -5.0

-5.5
.rounded() -6.0
.rounded(.down) -6.0
.rounded(.up) -5.0
.rounded(.towardZero) -5.0
.rounded(.awayFromZero) -6.0
.rounded(.toNearestOrEven) -6.0
.rounded(.toNearestOrAwayFromZero) -6.0

0.51
.rounded() 1.0
.rounded(.down) 0.0
.rounded(.up) 1.0
.rounded(.towardZero) 0.0
.rounded(.awayFromZero) 1.0
.rounded(.toNearestOrEven) 1.0
.rounded(.toNearestOrAwayFromZero) 1.0

0.0
.rounded() 0.0
.rounded(.down) 0.0
.rounded(.up) 0.0
.rounded(.towardZero) 0.0
.rounded(.awayFromZero) 0.0
.rounded(.toNearestOrEven) 0.0
.rounded(.toNearestOrAwayFromZero) 0.0

0.03
.rounded() 0.0
.rounded(.down) 0.0
.rounded(.up) 1.0
.rounded(.towardZero) 0.0
.rounded(.awayFromZero) 1.0
.rounded(.toNearestOrEven) 0.0
.rounded(.toNearestOrAwayFromZero) 0.0

1.001
.rounded() 1.0
.rounded(.down) 1.0
.rounded(.up) 2.0
.rounded(.towardZero) 1.0
.rounded(.awayFromZero) 2.0
.rounded(.toNearestOrEven) 1.0
.rounded(.toNearestOrAwayFromZero) 1.0

👉 rounded(_:) | Apple Developer Documentation hatena-bookmark
👉 round() | Apple Developer Documentation hatena-bookmark
👉 FloatingPointRoundingRule | Apple Developer Documentation hatena-bookmark

 

🧑‍💻 チャートにしてみる

視覚化してみると全然ちげえ !



 

🧑‍💻 まとめ

僕たちが日頃使っている四捨五入は、


.rounded()

で、


.rounded(.toNearestOrAwayFromZero)

のことと同じで、

「schoolbook rounding (教科書丸め)」

と呼ばれているようです。

「bankers rounding (銀行丸め)」

とか、要領よく出来てるんですね !

👉 端数処理 - Wikipedia hatena-bookmark

ちなみに「四捨五入」って多すぎ。

👉 Rounding a double value to x number of decimal places in swift - Stack Overflow hatena-bookmark



【Swift】Color の RGB + Opacity の数値を求める

カラーピッカーの

スポイドで

色を確認してたけど、

なんか、あやしい。


数値化してスッキリしたい。

 

🎨 Color から赤、緑、青の値を読み取る


struct ContentView: View {
  @Environment(\.self) var environment
  @State private var color = Color.red
  @State private var resolvedColor: Color.Resolved?

  var body: some View {
    VStack {
      ColorPicker("Select your favorite color", selection: $color)

      if let resolvedColor {
        Text("Red: \(resolvedColor.red)")
        Text("Green: \(resolvedColor.green)")
        Text("Blue: \(resolvedColor.blue)")
        Text("Opacity: \(resolvedColor.opacity)")
      }
    }
    .padding()
    .onChange(of: color, initial: true, getColor)
  }

  func getColor() {
    resolvedColor = color.resolve(in: environment)
  }
}

👉 How to read the red, green, and blue values from a Color - a free SwiftUI by Example tutorial hatena-bookmark

ビルトインの ColorPicker で取得した色を数字化して表示していますね。

分かりやすい !

 

🎨 小数点以下3桁に丸める

ついでに、

小数点以下4桁目を丸めて3桁にして、

0で埋める。


String(format:"%.3f", (0.123456 * 1000).rounded() / 1000)
// 0.123

👉 【Swift】2024年5月版 四捨五入と小数点と0埋め hatena-bookmark

てか、String のみで四捨五入できる、とか!

👉 Rounding a double value to x number of decimal places in swift - Stack Overflow hatena-bookmark

 

🎨 まとめ

これらをまとめて整理しておきます。



Light / Dark 共、

数字が同じになりました。

なるほど、

Dynamic System Color というのは、

environment を見ながら色を変化させているのか !

変化させていたのだ !