From 5dda93c487ab6618b8269a22c8ec6f40c5475047 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=96=E5=8D=93=E6=9E=97?= Date: Sat, 1 Aug 2026 08:16:50 +0800 Subject: [PATCH] Avoid crashing on unexpected localized key storage --- Sources/SwiftNavigation/TextState.swift | 14 ++++++++++---- .../LocalizedStringKeyTests.swift | 12 ++++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) create mode 100644 Tests/SwiftNavigationTests/LocalizedStringKeyTests.swift diff --git a/Sources/SwiftNavigation/TextState.swift b/Sources/SwiftNavigation/TextState.swift index 1a9848bfb..2279c1051 100644 --- a/Sources/SwiftNavigation/TextState.swift +++ b/Sources/SwiftNavigation/TextState.swift @@ -701,21 +701,27 @@ extension String { comment: StaticString? = nil ) -> String { let children = Array(Mirror(reflecting: self).children) - let key = children[0].value as! String + guard children.count > 2, let key = children[0].value as? String else { + return "" + } let arguments: [any CVarArg] = Array(Mirror(reflecting: children[2].value).children) .compactMap { let children = Array(Mirror(reflecting: $0.value).children) + guard !children.isEmpty else { return nil } let value: Any let formatter: Formatter? // `LocalizedStringKey.FormatArgument` differs depending on OS/platform. if children[0].label == "storage" { - (value, formatter) = - Array(Mirror(reflecting: children[0].value).children)[0].value as! (Any, Formatter?) + guard let storage = Array(Mirror(reflecting: children[0].value).children).first?.value + as? (Any, Formatter?) + else { return nil } + (value, formatter) = storage } else { + guard children.count > 1 else { return nil } value = children[0].value formatter = children[1].value as? Formatter } - return formatter?.string(for: value) ?? value as! any CVarArg + return formatter?.string(for: value) ?? value as? any CVarArg } let format = NSLocalizedString( diff --git a/Tests/SwiftNavigationTests/LocalizedStringKeyTests.swift b/Tests/SwiftNavigationTests/LocalizedStringKeyTests.swift new file mode 100644 index 000000000..7bb26dd93 --- /dev/null +++ b/Tests/SwiftNavigationTests/LocalizedStringKeyTests.swift @@ -0,0 +1,12 @@ +#if canImport(SwiftUI) + import SwiftNavigation + import SwiftUI + import XCTest + + final class LocalizedStringKeyTests: XCTestCase { + func testTextStateLocalizedStringKeyWithUnexpectedStorageDoesNotCrash() { + let text = TextState("\(AttributedString("Hello, world!"))") + XCTAssertFalse(String(state: text).isEmpty) + } + } +#endif