From 4b59d63ce526a0db5839fb2eb4c4df63bf670ddf Mon Sep 17 00:00:00 2001 From: Jeremy Schonfeld Date: Wed, 29 May 2024 11:56:29 -0700 Subject: [PATCH] Return file attributes as NSNumbers when SCL-F is imported --- .../FileManager/FileManager+Files.swift | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/Sources/FoundationEssentials/FileManager/FileManager+Files.swift b/Sources/FoundationEssentials/FileManager/FileManager+Files.swift index bed9d4f18..5e62c9188 100644 --- a/Sources/FoundationEssentials/FileManager/FileManager+Files.swift +++ b/Sources/FoundationEssentials/FileManager/FileManager+Files.swift @@ -106,6 +106,18 @@ func _readFileAttributePrimitive(_ value: Any?, as type: Bool.Type) -> Bool? { return nil } +#if !FOUNDATION_FRAMEWORK +@_spi(SwiftCorelibsFoundation) +public protocol _NSNumberInitializer { + static func initialize(value: Bool) -> Any + static func initialize(value: some BinaryInteger) -> Any +} + +private let _nsNumberInitializer: (any _NSNumberInitializer.Type)? = { + _typeByName("Foundation._FoundationNSNumberInitializer") as? any _NSNumberInitializer.Type +}() +#endif + func _writeFileAttributePrimitive(_ value: T, as type: U.Type) -> Any { #if FOUNDATION_FRAMEWORK if let int = Int64(exactly: value) { @@ -114,7 +126,11 @@ func _writeFileAttributePrimitive(_ value: T NSNumber(value: UInt64(value)) } #else - U(value) + if let ns = _nsNumberInitializer?.initialize(value: value) { + return ns + } else { + return U(value) + } #endif } @@ -122,7 +138,11 @@ func _writeFileAttributePrimitive(_ value: Bool) -> Any { #if FOUNDATION_FRAMEWORK NSNumber(value: value) #else - value + if let ns = _nsNumberInitializer?.initialize(value: value) { + return ns + } else { + return value + } #endif }