diff --git a/0097-adaptive-state-management-pt4/PrimeTime/Counter/Counter.swift b/0097-adaptive-state-management-pt4/PrimeTime/Counter/Counter.swift index 471170f3..62dccf05 100644 --- a/0097-adaptive-state-management-pt4/PrimeTime/Counter/Counter.swift +++ b/0097-adaptive-state-management-pt4/PrimeTime/Counter/Counter.swift @@ -9,7 +9,8 @@ public typealias CounterState = ( alertNthPrime: PrimeAlert?, count: Int, isNthPrimeRequestInFlight: Bool, - isPrimeModalShown: Bool +// isPrimeModalShown: Bool + isPrimeDetailShown: Bool ) public enum CounterAction: Equatable { @@ -20,7 +21,8 @@ public enum CounterAction: Equatable { case nthPrimeResponse(n: Int, prime: Int?) case alertDismissButtonTapped case isPrimeButtonTapped - case primeModalDismissed +// case primeModalDismissed + case primeDetailDismissed // case doubleTap } @@ -60,11 +62,11 @@ public func counterReducer( return [] case .isPrimeButtonTapped: - state.isPrimeModalShown = true + state.isPrimeDetailShown = true return [] - case .primeModalDismissed: - state.isPrimeModalShown = false + case .primeDetailDismissed: + state.isPrimeDetailShown = false return [] // case .doubleTap: @@ -100,7 +102,7 @@ public struct CounterFeatureState: Equatable { public var favoritePrimes: [Int] // public var isNthPrimeButtonDisabled: Bool public var isNthPrimeRequestInFlight: Bool - public var isPrimeModalShown: Bool + public var isPrimeDetailShown: Bool // public var isLoadingIndicatorHidden: Bool @@ -109,18 +111,18 @@ public struct CounterFeatureState: Equatable { count: Int = 0, favoritePrimes: [Int] = [], isNthPrimeRequestInFlight: Bool = false, - isPrimeModalShown: Bool = false + isPrimeDetailShown: Bool = false ) { self.alertNthPrime = alertNthPrime self.count = count self.favoritePrimes = favoritePrimes self.isNthPrimeRequestInFlight = isNthPrimeRequestInFlight - self.isPrimeModalShown = isPrimeModalShown + self.isPrimeDetailShown = isPrimeDetailShown } var counter: CounterState { - get { (self.alertNthPrime, self.count, self.isNthPrimeRequestInFlight, self.isPrimeModalShown) } - set { (self.alertNthPrime, self.count, self.isNthPrimeRequestInFlight, self.isPrimeModalShown) = newValue } + get { (self.alertNthPrime, self.count, self.isNthPrimeRequestInFlight, self.isPrimeDetailShown) } + set { (self.alertNthPrime, self.count, self.isNthPrimeRequestInFlight, self.isPrimeDetailShown) = newValue } } var primeModal: PrimeModalState { @@ -133,117 +135,3 @@ public enum CounterFeatureAction: Equatable { case counter(CounterAction) case primeModal(PrimeModalAction) } - -public struct CounterView: View { - struct State: Equatable { - let alertNthPrime: PrimeAlert? - let count: Int - let isNthPrimeButtonDisabled: Bool - let isPrimeModalShown: Bool - let isIncrementButtonDisabled: Bool - let isDecrementButtonDisabled: Bool - let nthPrimeButtonTitle: String - } - public enum Action { - case decrTapped - case incrTapped - case nthPrimeButtonTapped - case alertDismissButtonTapped - case isPrimeButtonTapped - case primeModalDismissed - case doubleTap - } - - let store: Store - @ObservedObject var viewStore: ViewStore - - public init(store: Store) { - print("CounterView.init") - self.store = store - self.viewStore = self.store - .scope( - value: State.init, - action: CounterFeatureAction.init - ) - .view - } - - public var body: some View { - print("CounterView.body") - return VStack { - HStack { - Button("-") { self.viewStore.send(.decrTapped) } - .disabled(self.viewStore.value.isDecrementButtonDisabled) - Text("\(self.viewStore.value.count)") - Button("+") { self.viewStore.send(.incrTapped) } - .disabled(self.viewStore.value.isIncrementButtonDisabled) - } - Button("Is this prime?") { self.viewStore.send(.isPrimeButtonTapped) } - Button(self.viewStore.value.nthPrimeButtonTitle) { - self.viewStore.send(.nthPrimeButtonTapped) - } - .disabled(self.viewStore.value.isNthPrimeButtonDisabled) - } - .font(.title) - .navigationBarTitle("Counter demo") - .sheet( - isPresented: .constant(self.viewStore.value.isPrimeModalShown), - onDismiss: { self.viewStore.send(.primeModalDismissed) } - ) { - IsPrimeModalView( - store: self.store.scope( - value: { ($0.count, $0.favoritePrimes) }, - action: { .primeModal($0) } - ) - ) - } - .alert( - item: .constant(self.viewStore.value.alertNthPrime) - ) { alert in - Alert( - title: Text(alert.title), - dismissButton: .default(Text("Ok")) { - self.viewStore.send(.alertDismissButtonTapped) - } - ) - } - .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity) - .background(Color.white) - .onTapGesture(count: 2) { - self.viewStore.send(.doubleTap) - } - } -} - -extension CounterView.State { - init(counterFeatureState: CounterFeatureState) { - self.alertNthPrime = counterFeatureState.alertNthPrime - self.count = counterFeatureState.count - self.isNthPrimeButtonDisabled = counterFeatureState.isNthPrimeRequestInFlight - self.isPrimeModalShown = counterFeatureState.isPrimeModalShown - self.isIncrementButtonDisabled = counterFeatureState.isNthPrimeRequestInFlight - self.isDecrementButtonDisabled = counterFeatureState.isNthPrimeRequestInFlight - self.nthPrimeButtonTitle = "What is the \(ordinal(counterFeatureState.count)) prime?" - } -} - -extension CounterFeatureAction { - init(action: CounterView.Action) { - switch action { - case .decrTapped: - self = .counter(.decrTapped) - case .incrTapped: - self = .counter(.incrTapped) - case .nthPrimeButtonTapped: - self = .counter(.requestNthPrime) - case .alertDismissButtonTapped: - self = .counter(.alertDismissButtonTapped) - case .isPrimeButtonTapped: - self = .counter(.isPrimeButtonTapped) - case .primeModalDismissed: - self = .counter(.primeModalDismissed) - case .doubleTap: - self = .counter(.requestNthPrime) - } - } -} diff --git a/0097-adaptive-state-management-pt4/PrimeTime/Counter/CounterView_iOS.swift b/0097-adaptive-state-management-pt4/PrimeTime/Counter/CounterView_iOS.swift new file mode 100644 index 00000000..5c5c3e9a --- /dev/null +++ b/0097-adaptive-state-management-pt4/PrimeTime/Counter/CounterView_iOS.swift @@ -0,0 +1,121 @@ +#if os(iOS) +import Combine +import ComposableArchitecture +import PrimeAlert +import PrimeModal +import SwiftUI + +public struct CounterView: View { + struct State: Equatable { + let alertNthPrime: PrimeAlert? + let count: Int + let isNthPrimeButtonDisabled: Bool + let isPrimeModalShown: Bool + let isIncrementButtonDisabled: Bool + let isDecrementButtonDisabled: Bool + let nthPrimeButtonTitle: String + } + public enum Action { + case decrTapped + case incrTapped + case nthPrimeButtonTapped + case alertDismissButtonTapped + case isPrimeButtonTapped + case primeModalDismissed + case doubleTap + } + + let store: Store + @ObservedObject var viewStore: ViewStore + + public init(store: Store) { + print("CounterView.init") + self.store = store + self.viewStore = self.store + .scope( + value: State.init, + action: CounterFeatureAction.init + ) + .view + } + + public var body: some View { + print("CounterView.body") + return VStack { + HStack { + Button("-") { self.viewStore.send(.decrTapped) } + .disabled(self.viewStore.value.isDecrementButtonDisabled) + Text("\(self.viewStore.value.count)") + Button("+") { self.viewStore.send(.incrTapped) } + .disabled(self.viewStore.value.isIncrementButtonDisabled) + } + Button("Is this prime?") { self.viewStore.send(.isPrimeButtonTapped) } + Button(self.viewStore.value.nthPrimeButtonTitle) { + self.viewStore.send(.nthPrimeButtonTapped) + } + .disabled(self.viewStore.value.isNthPrimeButtonDisabled) + } + .font(.title) + .navigationBarTitle("Counter demo") + .sheet( + isPresented: .constant(self.viewStore.value.isPrimeModalShown), + onDismiss: { self.viewStore.send(.primeModalDismissed) } + ) { + IsPrimeModalView( + store: self.store.scope( + value: { ($0.count, $0.favoritePrimes) }, + action: { .primeModal($0) } + ) + ) + } + .alert( + item: .constant(self.viewStore.value.alertNthPrime) + ) { alert in + Alert( + title: Text(alert.title), + dismissButton: .default(Text("Ok")) { + self.viewStore.send(.alertDismissButtonTapped) + } + ) + } + .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity) + .background(Color.white) + .onTapGesture(count: 2) { + self.viewStore.send(.doubleTap) + } + } +} + +extension CounterView.State { + init(counterFeatureState: CounterFeatureState) { + self.alertNthPrime = counterFeatureState.alertNthPrime + self.count = counterFeatureState.count + self.isNthPrimeButtonDisabled = counterFeatureState.isNthPrimeRequestInFlight + self.isPrimeModalShown = counterFeatureState.isPrimeDetailShown + self.isIncrementButtonDisabled = counterFeatureState.isNthPrimeRequestInFlight + self.isDecrementButtonDisabled = counterFeatureState.isNthPrimeRequestInFlight + self.nthPrimeButtonTitle = "What is the \(ordinal(counterFeatureState.count)) prime?" + } +} + +extension CounterFeatureAction { + init(action: CounterView.Action) { + switch action { + case .decrTapped: + self = .counter(.decrTapped) + case .incrTapped: + self = .counter(.incrTapped) + case .nthPrimeButtonTapped: + self = .counter(.requestNthPrime) + case .alertDismissButtonTapped: + self = .counter(.alertDismissButtonTapped) + case .isPrimeButtonTapped: + self = .counter(.isPrimeButtonTapped) + case .primeModalDismissed: + self = .counter(.primeDetailDismissed) + case .doubleTap: + self = .counter(.requestNthPrime) + } + } +} +#endif diff --git a/0097-adaptive-state-management-pt4/PrimeTime/Counter/CounterView_macOS.swift b/0097-adaptive-state-management-pt4/PrimeTime/Counter/CounterView_macOS.swift new file mode 100644 index 00000000..853de721 --- /dev/null +++ b/0097-adaptive-state-management-pt4/PrimeTime/Counter/CounterView_macOS.swift @@ -0,0 +1,125 @@ +#if os(macOS) +import Combine +import ComposableArchitecture +import PrimeAlert +import PrimeModal +import SwiftUI + +public struct CounterView: View { + struct State: Equatable { + let alertNthPrime: PrimeAlert? + let count: Int + let isNthPrimeButtonDisabled: Bool + let isPrimePopoverShown: Bool + let isIncrementButtonDisabled: Bool + let isDecrementButtonDisabled: Bool + let nthPrimeButtonTitle: String + } + public enum Action { + case decrTapped + case incrTapped + case nthPrimeButtonTapped + case alertDismissButtonTapped + case isPrimeButtonTapped + case primePopoverDismissed +// case doubleTap + } + + let store: Store + @ObservedObject var viewStore: ViewStore + + public init(store: Store) { + print("CounterView.init") + self.store = store + self.viewStore = self.store + .scope( + value: State.init, + action: CounterFeatureAction.init + ) + .view + } + + public var body: some View { + print("CounterView.body") + return VStack { + HStack { + Button("-") { self.viewStore.send(.decrTapped) } + .disabled(self.viewStore.value.isDecrementButtonDisabled) + Text("\(self.viewStore.value.count)") + Button("+") { self.viewStore.send(.incrTapped) } + .disabled(self.viewStore.value.isIncrementButtonDisabled) + } + Button("Is this prime?") { self.viewStore.send(.isPrimeButtonTapped) } + Button(self.viewStore.value.nthPrimeButtonTitle) { + self.viewStore.send(.nthPrimeButtonTapped) + } + .disabled(self.viewStore.value.isNthPrimeButtonDisabled) + } +// .font(.title) +// .navigationBarTitle("Counter demo") + .popover( + isPresented: Binding( + get: { self.viewStore.value.isPrimePopoverShown }, + set: { _ in self.viewStore.send(.primePopoverDismissed) } + ) + //.constant(self.viewStore.value.isPrimeModalShown) +// onDismiss: { self.viewStore.send(.primeModalDismissed) } + ) { + IsPrimeModalView( + store: self.store.scope( + value: { ($0.count, $0.favoritePrimes) }, + action: { .primeModal($0) } + ) + ) + } + .alert( + item: .constant(self.viewStore.value.alertNthPrime) + ) { alert in + Alert( + title: Text(alert.title), + dismissButton: .default(Text("Ok")) { + self.viewStore.send(.alertDismissButtonTapped) + } + ) + } +// .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity) +// .background(Color.white) +// .onTapGesture(count: 2) { +// self.viewStore.send(.doubleTap) +// } + } +} + +extension CounterView.State { + init(counterFeatureState: CounterFeatureState) { + self.alertNthPrime = counterFeatureState.alertNthPrime + self.count = counterFeatureState.count + self.isNthPrimeButtonDisabled = counterFeatureState.isNthPrimeRequestInFlight + self.isPrimePopoverShown = counterFeatureState.isPrimeDetailShown + self.isIncrementButtonDisabled = counterFeatureState.isNthPrimeRequestInFlight + self.isDecrementButtonDisabled = counterFeatureState.isNthPrimeRequestInFlight + self.nthPrimeButtonTitle = "What is the \(ordinal(counterFeatureState.count)) prime?" + } +} + +extension CounterFeatureAction { + init(action: CounterView.Action) { + switch action { + case .decrTapped: + self = .counter(.decrTapped) + case .incrTapped: + self = .counter(.incrTapped) + case .nthPrimeButtonTapped: + self = .counter(.requestNthPrime) + case .alertDismissButtonTapped: + self = .counter(.alertDismissButtonTapped) + case .isPrimeButtonTapped: + self = .counter(.isPrimeButtonTapped) + case .primePopoverDismissed: + self = .counter(.primeDetailDismissed) +// case .doubleTap: +// self = .counter(.requestNthPrime) + } + } +} +#endif diff --git a/0097-adaptive-state-management-pt4/PrimeTime/PrimeTime.playground/Pages/Counter.xcplaygroundpage/Contents.swift b/0097-adaptive-state-management-pt4/PrimeTime/PrimeTime.playground/Pages/Counter.xcplaygroundpage/Contents.swift index 2d4fc91e..87dffa7d 100644 --- a/0097-adaptive-state-management-pt4/PrimeTime/PrimeTime.playground/Pages/Counter.xcplaygroundpage/Contents.swift +++ b/0097-adaptive-state-management-pt4/PrimeTime/PrimeTime.playground/Pages/Counter.xcplaygroundpage/Contents.swift @@ -3,17 +3,17 @@ import ComposableArchitecture import PlaygroundSupport import SwiftUI -PlaygroundPage.current.liveView = UIHostingController( - rootView: CounterView( +PlaygroundPage.current.setLiveView( + CounterView( store: Store( initialValue: CounterFeatureState( alertNthPrime: nil, count: 0, favoritePrimes: [], - isNthPrimeButtonDisabled: false + isNthPrimeRequestInFlight: false ), reducer: logging(counterViewReducer), - environment: { _ in .sync { 7236893748932 } } + environment: Counter.nthPrime ) ) ) diff --git a/0097-adaptive-state-management-pt4/PrimeTime/PrimeTime.playground/contents.xcplayground b/0097-adaptive-state-management-pt4/PrimeTime/PrimeTime.playground/contents.xcplayground index 93344358..de1478c1 100644 --- a/0097-adaptive-state-management-pt4/PrimeTime/PrimeTime.playground/contents.xcplayground +++ b/0097-adaptive-state-management-pt4/PrimeTime/PrimeTime.playground/contents.xcplayground @@ -1,5 +1,5 @@ - + diff --git a/0097-adaptive-state-management-pt4/PrimeTime/PrimeTime.xcodeproj/project.pbxproj b/0097-adaptive-state-management-pt4/PrimeTime/PrimeTime.xcodeproj/project.pbxproj index 5e68dd97..5f9a4259 100644 --- a/0097-adaptive-state-management-pt4/PrimeTime/PrimeTime.xcodeproj/project.pbxproj +++ b/0097-adaptive-state-management-pt4/PrimeTime/PrimeTime.xcodeproj/project.pbxproj @@ -7,6 +7,8 @@ objects = { /* Begin PBXBuildFile section */ + 2A5AFE432423FCC600640A58 /* CounterView_iOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A5AFE422423FCC600640A58 /* CounterView_iOS.swift */; }; + 2A5AFE452423FD2E00640A58 /* CounterView_macOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A5AFE442423FD2E00640A58 /* CounterView_macOS.swift */; }; CA304E7A23F48C1400E79D83 /* PrimeAlert.h in Headers */ = {isa = PBXBuildFile; fileRef = CA304E7823F48C1400E79D83 /* PrimeAlert.h */; settings = {ATTRIBUTES = (Public, ); }; }; CA304E7D23F48C1400E79D83 /* PrimeAlert.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA304E7623F48C1400E79D83 /* PrimeAlert.framework */; }; CA304E7E23F48C1400E79D83 /* PrimeAlert.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = CA304E7623F48C1400E79D83 /* PrimeAlert.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; @@ -235,6 +237,8 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 2A5AFE422423FCC600640A58 /* CounterView_iOS.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CounterView_iOS.swift; sourceTree = ""; }; + 2A5AFE442423FD2E00640A58 /* CounterView_macOS.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CounterView_macOS.swift; sourceTree = ""; }; CA304E7623F48C1400E79D83 /* PrimeAlert.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PrimeAlert.framework; sourceTree = BUILT_PRODUCTS_DIR; }; CA304E7823F48C1400E79D83 /* PrimeAlert.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PrimeAlert.h; sourceTree = ""; }; CA304E7923F48C1400E79D83 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -548,6 +552,8 @@ DCF0C5C023260348008B45A0 /* Counter.h */, DCF0C5C123260348008B45A0 /* Info.plist */, DCF0C62D23260414008B45A0 /* Counter.swift */, + 2A5AFE422423FCC600640A58 /* CounterView_iOS.swift */, + 2A5AFE442423FD2E00640A58 /* CounterView_macOS.swift */, DC29217322FB231F006090DF /* WolframAlpha.swift */, ); path = Counter; @@ -1174,6 +1180,8 @@ files = ( DCF0C62E23260414008B45A0 /* Counter.swift in Sources */, CAD67E2023329887000C7787 /* WolframAlpha.swift in Sources */, + 2A5AFE432423FCC600640A58 /* CounterView_iOS.swift in Sources */, + 2A5AFE452423FD2E00640A58 /* CounterView_macOS.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1351,6 +1359,7 @@ /* Begin XCBuildConfiguration section */ CA304E7F23F48C1400E79D83 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = DC69E63E2404865D00FCF3C2 /* Framework.xcconfig */; buildSettings = { CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; @@ -1379,6 +1388,7 @@ }; CA304E8023F48C1400E79D83 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = DC69E63E2404865D00FCF3C2 /* Framework.xcconfig */; buildSettings = { CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; @@ -1638,6 +1648,7 @@ }; DCF0C5B32326032B008B45A0 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = DC69E63E2404865D00FCF3C2 /* Framework.xcconfig */; buildSettings = { CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; @@ -1666,6 +1677,7 @@ }; DCF0C5B42326032B008B45A0 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = DC69E63E2404865D00FCF3C2 /* Framework.xcconfig */; buildSettings = { CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; @@ -1693,6 +1705,7 @@ }; DCF0C5B52326032B008B45A0 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = DC69E63F2404865D00FCF3C2 /* Test.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CODE_SIGN_STYLE = Automatic; @@ -1712,6 +1725,7 @@ }; DCF0C5B62326032B008B45A0 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = DC69E63F2404865D00FCF3C2 /* Test.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CODE_SIGN_STYLE = Automatic; @@ -1731,6 +1745,7 @@ }; DCF0C5D623260348008B45A0 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = DC69E63E2404865D00FCF3C2 /* Framework.xcconfig */; buildSettings = { CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; @@ -1759,6 +1774,7 @@ }; DCF0C5D723260348008B45A0 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = DC69E63E2404865D00FCF3C2 /* Framework.xcconfig */; buildSettings = { CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; @@ -1786,6 +1802,7 @@ }; DCF0C5D923260348008B45A0 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = DC69E63F2404865D00FCF3C2 /* Test.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CODE_SIGN_STYLE = Automatic; @@ -1805,6 +1822,7 @@ }; DCF0C5DA23260348008B45A0 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = DC69E63F2404865D00FCF3C2 /* Test.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CODE_SIGN_STYLE = Automatic; @@ -1824,6 +1842,7 @@ }; DCF0C5F82326035C008B45A0 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = DC69E63E2404865D00FCF3C2 /* Framework.xcconfig */; buildSettings = { CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; @@ -1852,6 +1871,7 @@ }; DCF0C5F92326035C008B45A0 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = DC69E63E2404865D00FCF3C2 /* Framework.xcconfig */; buildSettings = { CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; @@ -1879,6 +1899,7 @@ }; DCF0C5FB2326035C008B45A0 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = DC69E63F2404865D00FCF3C2 /* Test.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CODE_SIGN_STYLE = Automatic; @@ -1897,6 +1918,7 @@ }; DCF0C5FC2326035C008B45A0 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = DC69E63F2404865D00FCF3C2 /* Test.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CODE_SIGN_STYLE = Automatic; @@ -1915,6 +1937,7 @@ }; DCF0C61A2326036F008B45A0 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = DC69E63E2404865D00FCF3C2 /* Framework.xcconfig */; buildSettings = { CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; @@ -1943,6 +1966,7 @@ }; DCF0C61B2326036F008B45A0 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = DC69E63E2404865D00FCF3C2 /* Framework.xcconfig */; buildSettings = { CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; @@ -1970,6 +1994,7 @@ }; DCF0C61D2326036F008B45A0 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = DC69E63F2404865D00FCF3C2 /* Test.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CODE_SIGN_STYLE = Automatic; @@ -1988,6 +2013,7 @@ }; DCF0C61E2326036F008B45A0 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = DC69E63F2404865D00FCF3C2 /* Test.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CODE_SIGN_STYLE = Automatic;