Tl;Dr
なぜ作ったの?
vs 標準API
- ✅ 可読性
- ✅ 検索性(アイコンの視覚情報から探したい場合)
- 🚫 Xcode 以外(外部エディタやGitHub)でレンダリングされない。
vs SFSafeSymbols
- ✅ 可読性(さらに)
- ✅ 検索性(アイコンの視覚情報から探したい場合)
- ✅ 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コードやエディタを使って整形しただけです。
Special Thanks!
おわりに
そんなわけで、久しぶりに自分の作った OSS について記事を書いてみました。
好き嫌いがハッキリ分かれるタイプの OSS だと思いますので、もし肌に合うようでしたらご利用くださいませ🙏