From dd410f3ed08d1b0514f01481147582c873c941e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cihat=20G=C3=BCnd=C3=BCz?= Date: Tue, 13 Oct 2026 13:11:20 +0200 Subject: [PATCH] Strip symbol metadata in Image and Label convertible initializers CustomSymbolConvertible allows metadata after `:` or `*` (rotation and repeat count used by HPicker and VPicker) and documents that it is ignored when creating images. Image(convertible:) and Label(convertible:) passed the raw name though, so such symbols showed no icon at all, also in the CaseIterable Picker initializer and SideTabView that build on them. --- .../HandySwiftUI/Extensions/ImageExt.swift | 2 +- .../HandySwiftUI/Extensions/LabelExt.swift | 2 +- .../HandySwiftUITests/ConvertibleTests.swift | 25 +++++++++++++++++++ 3 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 Tests/HandySwiftUITests/ConvertibleTests.swift diff --git a/Sources/HandySwiftUI/Extensions/ImageExt.swift b/Sources/HandySwiftUI/Extensions/ImageExt.swift index 3d10af4..39f14b0 100644 --- a/Sources/HandySwiftUI/Extensions/ImageExt.swift +++ b/Sources/HandySwiftUI/Extensions/ImageExt.swift @@ -21,7 +21,7 @@ extension Image { /// let imageView = Image(convertible: symbol) /// ``` public init(convertible: CustomSymbolConvertible, variableValue: Double? = nil) { - self.init(systemName: convertible.symbolName, variableValue: variableValue) + self.init(systemName: convertible.symbolSystemName, variableValue: variableValue) } } diff --git a/Sources/HandySwiftUI/Extensions/LabelExt.swift b/Sources/HandySwiftUI/Extensions/LabelExt.swift index 0a5e5d1..026e3ab 100644 --- a/Sources/HandySwiftUI/Extensions/LabelExt.swift +++ b/Sources/HandySwiftUI/Extensions/LabelExt.swift @@ -19,6 +19,6 @@ extension Label { /// // Creates a Label with "Settings" text and a gear icon /// ``` public init(convertible: CustomLabelConvertible) { - self.init(convertible.description, systemImage: convertible.symbolName) + self.init(convertible.description, systemImage: convertible.symbolSystemName) } } diff --git a/Tests/HandySwiftUITests/ConvertibleTests.swift b/Tests/HandySwiftUITests/ConvertibleTests.swift new file mode 100644 index 0000000..9e6a945 --- /dev/null +++ b/Tests/HandySwiftUITests/ConvertibleTests.swift @@ -0,0 +1,25 @@ +import SwiftUI +import Testing + +@testable import HandySwiftUI + +@MainActor +struct ConvertibleTests { + struct RotatedStar: CustomLabelConvertible { + var description: String { "Rotated Star" } + var symbolName: String { "star:45*2" } + } + + @Test + func imageUsesTheSymbolNameWithoutMetadata() { + #expect(Image(convertible: RotatedStar()) == Image(systemName: "star")) + } + + @Test + func labelUsesTheSymbolNameWithoutMetadata() throws { + let label = Label(convertible: RotatedStar()) + let icon = try #require(Mirror(reflecting: label).children.first { $0.label == "icon" }?.value as? Image) + + #expect(icon == Image(systemName: "star")) + } +}