Skip to content

Commit 8b2bc11

Browse files
author
Peter Major
committed
Add @OptionalInjected attribute
1 parent 8e1e28e commit 8b2bc11

File tree

2 files changed

+33
-1
lines changed

2 files changed

+33
-1
lines changed

Sources/Resolver/Resolver.swift

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -626,6 +626,25 @@ public struct LazyInjected<Service> {
626626
}
627627
}
628628

629+
@propertyWrapper
630+
public struct OptionalInjected<Service> {
631+
private var service: Service?
632+
public init() {
633+
self.service = Resolver.optional(Service.self)
634+
}
635+
public init(name: String? = nil, container: Resolver? = nil) {
636+
self.service = container?.optional(Service.self, name: name) ?? Resolver.optional(Service.self, name: name)
637+
}
638+
public var wrappedValue: Service? {
639+
get { return service }
640+
mutating set { service = newValue }
641+
}
642+
public var projectedValue: OptionalInjected<Service> {
643+
get { return self }
644+
mutating set { self = newValue }
645+
}
646+
}
647+
629648
/// Immediate injection property wrapper for SwiftUI ObservableObjects. This wrapper is meant for use in SwiftUI Views and exposes
630649
/// bindable objects similar to that of SwiftUI @observedObject and @environmentObject.
631650
///

Tests/ResolverTests/ResolverInjectedTests.swift

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,14 @@ class LazyInjectedViewController {
3535
@LazyInjected var service: XYZService
3636
}
3737

38+
class OptionalInjectedViewController {
39+
@OptionalInjected var service: XYZService?
40+
@OptionalInjected var notRegistered: NotRegistered?
41+
}
42+
43+
class NotRegistered {
44+
}
45+
3846
class ResolverInjectedTests: XCTestCase {
3947

4048
override func setUp() {
@@ -84,7 +92,12 @@ class ResolverInjectedTests: XCTestCase {
8492
XCTAssertNotNil(vc.service.session)
8593
XCTAssert(!vc.$service.isEmpty)
8694
}
87-
95+
96+
func testOptionalInjection() {
97+
let vc = OptionalInjectedViewController()
98+
XCTAssertNotNil(vc.service)
99+
XCTAssertNil(vc.notRegistered)
100+
}
88101
}
89102

90103
#endif

0 commit comments

Comments
 (0)