Avatar
omochimetaru 10/5/2023 3:15 PM
swift-foundationの中に
3:15 PM
#if FOUNDATION_FRAMEWORK @_implementationOnly import _ForSwiftFoundation /// Wraps an `NSCalendar` with more Swift-like `Calendar` API. See also: `_NSSwiftCalendar`. /// This is only used in the case where we have custom Objective-C subclasses of `NSCalendar`. It is assumed that the subclass is Sendable. internal final class _CalendarBridged: _CalendarProtocol, @unchecked Sendable { let _calendar: NSCalendar
3:15 PM
こういう #if があって、
3:16 PM
#if FOUNDATION_FRAMEWORK @_implementationOnly import _ForSwiftFoundation import CoreFoundation #else #endif こういうのもあるから
3:17 PM
おそらく、従来の Foundation.framework がインポートできる環境において機能していて、
3:18 PM
実装を再利用するとか、ObjC-Bridgingを swift-foundation でも再実装しているんだと思うけど
3:18 PM
// MARK: - Bridging #if FOUNDATION_FRAMEWORK @available(macOS 10.10, iOS 8.0, watchOS 2.0, tvOS 9.0, *) extension Calendar : ReferenceConvertible { public typealias ReferenceType = NSCalendar } @available(macOS 10.10, iOS 8.0, watchOS 2.0, tvOS 9.0, *) extension Calendar : _ObjectiveCBridgeable { @_semantics("convertToObjectiveC") public func _bridgeToObjectiveC() -> NSCalendar { _calendar.bridgeToNSCalendar() } public static func _forceBridgeFromObjectiveC(_ input: NSCalendar, result: inout Calendar?) { if !_conditionallyBridgeFromObjectiveC(input, result: &result) { fatalError("Unable to bridge \(_ObjectiveCType.self) to \(self)") } } public static func _conditionallyBridgeFromObjectiveC(_ input: NSCalendar, result: inout Calendar?) -> Bool { result = Calendar(reference: input) return true } @_effects(readonly) public static func _unconditionallyBridgeFromObjectiveC(_ source: NSCalendar?) -> Calendar { var result: Calendar? _forceBridgeFromObjectiveC(source!, result: &result) return result! } } @available(macOS 10.10, iOS 8.0, watchOS 2.0, tvOS 9.0, *) extension NSCalendar : _HasCustomAnyHashableRepresentation { // Must be @nonobjc to avoid infinite recursion during bridging. @nonobjc public func _toCustomAnyHashable() -> AnyHashable? { return AnyHashable(self as Calendar) } } #endif // FOUNDATION_FRAMEWORK
3:18 PM
特にこれが気になっている @_implementationOnly import _ForSwiftFoundation
3:19 PM
つまり、 Foundation.framework の中に _ForSwiftFoundation というモジュールがあるはずで、
3:19 PM
意味としては 「for swift-foundation」で、swift-foundationが Foundation.framework を取り込む時に見せるためのヘッダー?可視性?を制御されたものだと思うんだけど
3:20 PM
corelibs-foundationの中を見ててもそのようなモジュールを定義している場所が見つけられなくてなんだろうとなっている
3:22 PM
でもこのヘッダー 2015年 (Swift2.2) のころからあるし、関係無さそうなんだよね (edited)
3:23 PM
でもどっちもparkeraさんが関わっては居る
3:25 PM
// _CalendarICU, if present static var calendarICUClass: _CalendarProtocol.Type = { #if FOUNDATION_FRAMEWORK _CalendarICU.self #else if let name = _typeByName("FoundationInternationalization._CalendarICU"), let t = name as? _CalendarProtocol.Type { return t } else { // Use the default gregorian class return _CalendarGregorian.self } #endif }()
3:25 PM
↑この _CalendarICU って型も corelibs-foundation の中から見つけられない。謎が深まる。