【Swift】よく使われている zip ファイルユーティリティ 2つ

よく似た Star数の2つ。

どっちが使いやすそうでしょうか。

 

🙆🏻‍♂️ ZIPFoundation


import ZIPFoundation


try fileManager.zipItem(at: sourceURL, to: destinationURL)


try fileManager.unzipItem(at: sourceURL, to: destinationURL)

共に、利用する FileManager の extension になっています。

👉 weichsel/ZIPFoundation: Effortless ZIP Handling in Swift hatena-bookmark

 

🙆🏻‍♂️ Zip


import Zip


let zipFilePath = try Zip.quickZipFiles([filePath], fileName: "archive")


let unzipDirectory = try Zip.quickUnzipFile(filePath)

Zip クラスの static な関数を利用するようです。

👉 marmelroy/Zip: Swift framework for zipping and unzipping files. hatena-bookmark

 

🙆🏻‍♂️ まとめ

共に、ファイル位置は「URL」を引数として使います。

もしかして、ビルトインで何か関数あるの?


【SwiftUI】ブラウザへのURLリンク

どう書くのか。

最新OSでシンプルなやつのみ。

iOS / macOS 考慮。


import SwiftUI

struct LinkTest: View {

  private let label = "【SwiftUI】ブラウザへのURLリンク"
  private let url = URL(string: "https://android.benigumo.com/20240525/browser-link/")!

  @Environment(\.openURL) private var openURL

  var body: some View {
    VStack {

      Link(label, destination: url)

      Link(destination: url) {
        Text(label)
      }

      Button(label) {
        openURL(url)
      }

      Button {
        openURL(url)
      } label: {
        Text(label)
      }
#if os(macOS)
      .buttonStyle(.link)
#endif

    }
    .padding()
  }
}

#Preview {
  LinkTest()
}

これくらいからで、どうにかなりますよね !

👉 Link | Apple Developer Documentation hatena-bookmark
👉 openURL | Apple Developer Documentation hatena-bookmark


【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】よく使いそうな String の format

プログラミング言語によって違うのよ、これが。

Swift の String()。


👉 init(format:_:) | Apple Developer Documentation hatena-bookmark

よく使われてるやつ。GitHub 調べ。


[

  String(format: "%02x", 255),
  // ff

  String(format: "%02X", 170),
  // AA

  String(format: "%02d", 1),
  // 01

  String(format: "% 5d", 2),
  //     2

  String(format: "%.2f", 1.2),
  // 1.20

  String(format: "%.2f", 1.204),
  // 1.20

  String(format: "%.2f", 1.205),
  // 1.21

  String(format: "%.0f", 1.23),
  // 1

  String(format: "%f", 3.12),
  // 3.120000

  String(format: "%+.2f", -123.5),
  // -123.50

  String(format: "%p", 3),
  // 0x3

  String(format: "%@", "x"),
  // x

  String(format: "%2$@ %1$@", "world", "Hello")
  // Hello world

].forEach {
  print($0)
}

知っておくだけで便利です。

👉 String Format Specifiers hatena-bookmark
👉 String Format Specifiers hatena-bookmark
👉 What are the supported Swift String format specifiers? - 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