Skip to content

Commit 3297fb3

Browse files
authored
Return file attributes as NSNumbers when SCL-F is imported (#641)
1 parent f29e378 commit 3297fb3

File tree

1 file changed

+22
-2
lines changed

1 file changed

+22
-2
lines changed

Sources/FoundationEssentials/FileManager/FileManager+Files.swift

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,18 @@ func _readFileAttributePrimitive(_ value: Any?, as type: Bool.Type) -> Bool? {
106106
return nil
107107
}
108108

109+
#if !FOUNDATION_FRAMEWORK
110+
@_spi(SwiftCorelibsFoundation)
111+
public protocol _NSNumberInitializer {
112+
static func initialize(value: Bool) -> Any
113+
static func initialize(value: some BinaryInteger) -> Any
114+
}
115+
116+
private let _nsNumberInitializer: (any _NSNumberInitializer.Type)? = {
117+
_typeByName("Foundation._FoundationNSNumberInitializer") as? any _NSNumberInitializer.Type
118+
}()
119+
#endif
120+
109121
func _writeFileAttributePrimitive<T: BinaryInteger, U: BinaryInteger>(_ value: T, as type: U.Type) -> Any {
110122
#if FOUNDATION_FRAMEWORK
111123
if let int = Int64(exactly: value) {
@@ -114,15 +126,23 @@ func _writeFileAttributePrimitive<T: BinaryInteger, U: BinaryInteger>(_ value: T
114126
NSNumber(value: UInt64(value))
115127
}
116128
#else
117-
U(value)
129+
if let ns = _nsNumberInitializer?.initialize(value: value) {
130+
return ns
131+
} else {
132+
return U(value)
133+
}
118134
#endif
119135
}
120136

121137
func _writeFileAttributePrimitive(_ value: Bool) -> Any {
122138
#if FOUNDATION_FRAMEWORK
123139
NSNumber(value: value)
124140
#else
125-
value
141+
if let ns = _nsNumberInitializer?.initialize(value: value) {
142+
return ns
143+
} else {
144+
return value
145+
}
126146
#endif
127147
}
128148

0 commit comments

Comments
 (0)