LoginSignup
6

More than 1 year has passed since last update.

[SwiftUI] 可読性にパラメータを全振りした SFReadableSymbols という OSS を作った話。

Posted at

Tl;Dr

image.png

image.png

なぜ作ったの?

vs 標準API

image.png

  • ✅ 可読性
  • ✅ 検索性(アイコンの視覚情報から探したい場合)
  • 🚫 Xcode 以外(外部エディタやGitHub)でレンダリングされない。

image.png

vs SFSafeSymbols

image.png

  • ✅ 可読性(さらに)
  • ✅ 検索性(アイコンの視覚情報から探したい場合)
  • ✅ SF Symbols アプリからコピペ(Cmd + C)できる(タイプし直す必要はない)
  • 🚫 入力補完はできない
  • 🚫 コンパイルタイムセーフではない

Effective SwiftUI 候補(仮説)『SFSafeSymbols が本当に必要かよく検討する』において、コンパイルタイムセーフという理由だけで SFSafeSymbols を利用すべきでない理由について詳しく述べています。

コンパイルタイムセーフという言葉は響きこそいいが、以下のような欠点もあることに留意すること。

  • SF Symbols アプリからコピーするだけではダメで、自分でタイプし直す必要がある。
  • タイプし直した結果が間違っていないことが、コンパイル時に保証されるわけではない。
  • 文字列リテラルと違ってシンタックスハイライトが効かない。
  • 文字列としてのリーダビリティは劣る。

利用例

App Store に公開中の、以下の2つのマルチプラットフォームアプリ(SwiftUI)で利用しています。

SE Browser

E2DC

制限

現時点では SFSymbols 3.2 (67) のみに対応しています。
(需要がありそうなら下位バージョンをサポートすることも検討しています)

仕組み

静的に用意したDictionary<Character, String>でシンボル名をルックアップしているだけの簡単な仕組みです。

// SF Symbols version 3.2 (67)
let symbolsToName: [Character: String] = [
    "􀈂": "square.and.arrow.up",
    "􀈃": "square.and.arrow.up.fill",
    "􁅅": "square.and.arrow.up.circle",
...
]

@available(iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.0, *)
public extension Image {
    init(symbol: Character) {
        self.init(systemName: symbolsToName[symbol] ?? "") // ✅ Lookup
    }
}

どうやって作ったの?

SF Symbols アプリで全選択してシンボルや名前をコピーし、Swiftコードやエディタを使って整形しただけです。
image.png

Special Thanks!

おわりに

そんなわけで、久しぶりに自分の作った OSS について記事を書いてみました。

好き嫌いがハッキリ分かれるタイプの OSS だと思いますので、もし肌に合うようでしたらご利用くださいませ🙏

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6