SFSymbolsMacro
A Swift Macro for "type-safe" SF Symbols.
= 13.0-blue.svg" /> = 11.0-blue.svg" /> = 6.0-blue.svg" /> = 13.0-blue.svg" /> The project is written primarily in Swift, distributed under the MIT License license, first published in 2023. Key topics include: swift, swift-macros, swift-package, swift-package-manager, swift5-9.
SFSymbolsMacro
This Swift Macro provides an easy way to make the use of SF Symbols in Swift more or less "type-safe".
Installation
Xcode
- Click File > Add Package Dependencies
- Paste the following link into the search field on the upper-right:
https://github.com/lukepistrol/SFSymbolsMacro.git
Swift Package Manager
In Package.swift:
swiftdependencies: [ .package(url: "https://github.com/lukepistrol/SFSymbolsMacro.git", from: "0.1.0") ]
And then add the dependency to your targets.
Usage
Simply create an enum which will hold all the SF Symbols for your project:
swiftenum Symbols: String { case circle case circleFill = "circle.fill" case shareIcon = "square.and.arrow.up" case globe }
Then simply import SFSymbolsMacro and add the @SFSymbol macro annotation to the enum:
swiftimport SFSymbolsMacro import SwiftUI @SFSymbol enum Symbols: String { ... }
The macro will then validate each case and the expanded macro will look something like this:
swiftenum Symbols: String { case circle case circleFill = "circle.fill" case shareIcon = "square.and.arrow.up" case globe var image: Image { Image(systemName: self.rawValue) } var name: String { self.rawValue } #if canImport(UIKit) func uiImage(configuration: UIImage.Configuration? = nil) -> UIImage { UIImage(systemName: self.rawValue, withConfiguration: configuration)! } #else func nsImage(accessibilityDescription: String? = nil) -> NSImage { return NSImage(systemSymbolName: self.rawValue, accessibilityDescription: accessibilityDescription)! } #endif func callAsFunction() -> String { return self.rawValue } }
In your code you can then call a symbol:
swiftvar body: some View { VStack { Symbols.circleFill.image Label("Globe", systemImage: Symbols.globe.name) // the above can also be written as Label("Globe", systemImage: Symbols.globe()) } }
In case the provided raw value is not a valid SF Symbol, Xcode will show a compile error at the enum-case in question:
Contribution
If you have any ideas on how to take this further I'm happy to discuss things in an issue.
<a href="https://www.buymeacoffee.com/lukeeep" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" alt="Buy Me A Coffee" style="height: 60px !important;width: 217px !important;" ></a>
Contributors
Showing top 3 contributors by commit count.
