SFSymbolEnum

一个 Swift 包,用于将 SF Symbols 以枚举的形式提供,而不是直接使用字符串。

现在你可以这样写

Image(systemImage:.person)
Label("Text",systemImage:.zlRectangleRoundedtopFill)

或者查看所有可用符号的列表

struct SwiftUIView: View {
    var body: some View {
        VStack {
            List(SFSymbol.allCases,id:\.name) { symbol in
                Label(symbol.name,systemImage:symbol)
            }
        }
    }
}

优点

安装

     import SFSymbolEnum

用法

使用 systemImage 参数的函数可以像以前一样使用,但使用点符号。符号名称通过将点符号替换为驼峰式大小写,并用数字作为前缀来将起始数字转换为枚举。

示例

    Image(systemName:"arrow.down.left.circle.fill")
    Image(systemName:"0.circle")
    Image(systemName:"arrow.2.circlepath.circle")

变成

    Image(systemName:.arrowDownLeftCircleFill)    
    Image(systemName:.number0Circle)    
    Image(systemName:.arrow2CirclepathCircle)    

它是如何实现的

代码本身是使用 SF Symbols 应用程序中的 name_availablity.plist 创建的,如下所示

public enum SFSymbol:String  // this enum will be generated
{
    @available(iOS 13.0,macOS 10.15,tvOS 13.0,watchOS 6.0,*) case number0Circle = "0.circle"
    @available(iOS 13.0,macOS 10.15,tvOS 13.0,watchOS 6.0,*) case number0CircleFill = "0.circle.fill"
...
}

extension SFSymbol:CaseIterable
{
    public static var allCases:[SFSymbol] {
                var allCases:[SFSymbol] = []
        if #available(iOS 13.0,macOS 10.15,tvOS 13.0,watchOS 6.0,*){ allCases.append(SFSymbol.number0Circle) }
        if #available(iOS 13.0,macOS 10.15,tvOS 13.0,watchOS 6.0,*){ allCases.append(SFSymbol.number0CircleFill) }
...
    return allCases	
    }
}