@@ -95,7 +95,9 @@ public struct DependencyValues: Sendable {
95
95
/// provide access only to default values. Instead, you rely on the dependency values' instance
96
96
/// that the library manages for you when you use the ``Dependency`` property wrapper.
97
97
public init ( ) {
98
- _ = setUpTestObservers
98
+ #if canImport(XCTest)
99
+ _ = setUpTestObservers
100
+ #endif
99
101
}
100
102
101
103
/// Accesses the dependency value associated with a custom key.
@@ -348,61 +350,63 @@ private final class CachedValues: @unchecked Sendable {
348
350
}
349
351
350
352
// NB: We cannot statically link/load XCTest on Apple platforms, so we dynamically load things
351
- // instead and we limit this to debug builds to avoid App Store binary rejection.
352
- #if !canImport(ObjectiveC)
353
- import XCTest
354
- #endif
353
+ // instead on platforms where XCTest is available.
354
+ #if canImport(XCTest)
355
+ #if !canImport(ObjectiveC)
356
+ import XCTest
357
+ #endif
355
358
356
- private let setUpTestObservers : Void = {
357
- if _XCTIsTesting {
358
- #if canImport(ObjectiveC)
359
- DispatchQueue . mainSync {
360
- guard
361
- let XCTestObservation = objc_getProtocol ( " XCTestObservation " ) ,
362
- let XCTestObservationCenter = NSClassFromString ( " XCTestObservationCenter " ) ,
363
- let XCTestObservationCenter = XCTestObservationCenter as Any as? NSObjectProtocol ,
364
- let XCTestObservationCenterShared =
365
- XCTestObservationCenter
366
- . perform ( Selector ( ( " sharedTestObservationCenter " ) ) ) ?
367
- . takeUnretainedValue ( )
368
- else { return }
369
- let testCaseWillStartBlock : @convention ( block) ( AnyObject ) -> Void = { _ in
370
- DependencyValues . _current. cachedValues. cached = [ : ]
359
+ private let setUpTestObservers : Void = {
360
+ if _XCTIsTesting {
361
+ #if canImport(ObjectiveC)
362
+ DispatchQueue . mainSync {
363
+ guard
364
+ let XCTestObservation = objc_getProtocol ( " XCTestObservation " ) ,
365
+ let XCTestObservationCenter = NSClassFromString ( " XCTestObservationCenter " ) ,
366
+ let XCTestObservationCenter = XCTestObservationCenter as Any as? NSObjectProtocol ,
367
+ let XCTestObservationCenterShared =
368
+ XCTestObservationCenter
369
+ . perform ( Selector ( ( " sharedTestObservationCenter " ) ) ) ?
370
+ . takeUnretainedValue ( )
371
+ else { return }
372
+ let testCaseWillStartBlock : @convention ( block) ( AnyObject ) -> Void = { _ in
373
+ DependencyValues . _current. cachedValues. cached = [ : ]
374
+ }
375
+ let testCaseWillStartImp = imp_implementationWithBlock ( testCaseWillStartBlock)
376
+ class_addMethod (
377
+ TestObserver . self, Selector ( ( " testCaseWillStart: " ) ) , testCaseWillStartImp, nil )
378
+ class_addProtocol ( TestObserver . self, XCTestObservation)
379
+ _ =
380
+ XCTestObservationCenterShared
381
+ . perform ( Selector ( ( " addTestObserver: " ) ) , with: TestObserver ( ) )
371
382
}
372
- let testCaseWillStartImp = imp_implementationWithBlock ( testCaseWillStartBlock)
373
- class_addMethod (
374
- TestObserver . self, Selector ( ( " testCaseWillStart: " ) ) , testCaseWillStartImp, nil )
375
- class_addProtocol ( TestObserver . self, XCTestObservation)
376
- _ =
377
- XCTestObservationCenterShared
378
- . perform ( Selector ( ( " addTestObserver: " ) ) , with: TestObserver ( ) )
383
+ #else
384
+ XCTestObservationCenter . shared. addTestObserver ( TestObserver ( ) )
385
+ #endif
386
+ }
387
+ } ( )
388
+
389
+ #if canImport(ObjectiveC)
390
+ private final class TestObserver : NSObject { }
391
+ #else
392
+ private final class TestObserver : NSObject , XCTestObservation {
393
+ func testCaseWillStart( _ testCase: XCTestCase ) {
394
+ DependencyValues . _current. cachedValues. cached = [ : ]
379
395
}
380
- #else
381
- XCTestObservationCenter . shared. addTestObserver ( TestObserver ( ) )
382
- #endif
383
- }
384
- } ( )
385
-
386
- #if canImport(ObjectiveC)
387
- private final class TestObserver : NSObject { }
388
- #else
389
- private final class TestObserver : NSObject , XCTestObservation {
390
- func testCaseWillStart( _ testCase: XCTestCase ) {
391
- DependencyValues . _current. cachedValues. cached = [ : ]
392
396
}
393
- }
394
- #endif
397
+ #endif
395
398
396
- extension DispatchQueue {
397
- private static let key = DispatchSpecificKey < UInt8 > ( )
398
- private static let value : UInt8 = 0
399
+ extension DispatchQueue {
400
+ private static let key = DispatchSpecificKey < UInt8 > ( )
401
+ private static let value : UInt8 = 0
399
402
400
- fileprivate static func mainSync< R> ( execute block: @Sendable ( ) -> R ) -> R {
401
- Self . main. setSpecific ( key: Self . key, value: Self . value)
402
- if getSpecific ( key: Self . key) == Self . value {
403
- return block ( )
404
- } else {
405
- return Self . main. sync ( execute: block)
403
+ fileprivate static func mainSync< R> ( execute block: @Sendable ( ) -> R ) -> R {
404
+ Self . main. setSpecific ( key: Self . key, value: Self . value)
405
+ if getSpecific ( key: Self . key) == Self . value {
406
+ return block ( )
407
+ } else {
408
+ return Self . main. sync ( execute: block)
409
+ }
406
410
}
407
411
}
408
- }
412
+ #endif
0 commit comments