mirror of
https://github.com/pointfreeco/swift-composable-architecture.git
synced 2025-12-20 09:11:33 +01:00
* wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * Silence test warnings * wip * wip * wip * update a bunch of docs * wip * wip * fix * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * Kill integration tests for now * wip * wip * wip * wip * updating docs for @Reducer macro * replaced more Reducer protocols with @Reducer * Fixed some broken docc references * wip * Some @Reducer docs * more docs * convert some old styles to new style * wip * wip * wip * wip * wip * wip * wip * bump * update tutorials to use body * update tutorials to use DML on destination state enum * Add diagnostic * wip * updated a few more tests * wip * wip * Add another gotcha * wip * wip * wip * fixes * wip * wip * wip * wip * wip * fix * wip * remove for now * wip * wip * updated some docs * migration guides * more migration guide * fix ci * fix * soft deprecate all apis using AnyCasePath * wip * Fix * fix tests * swift-format 509 compatibility * wip * wip * Update Sources/ComposableArchitecture/Macros.swift Co-authored-by: Mateusz Bąk <bakmatthew@icloud.com> * wip * wip * update optional state case study * remove initializer * Don't use @State for BasicsView integration demo * fix tests * remove reduce diagnostics for now * diagnose error not warning * Update Sources/ComposableArchitecture/Macros.swift Co-authored-by: Jesse Tipton <jesse@jessetipton.com> * wip * move integration tests to cron * Revert "move integration tests to cron" This reverts commitf9bdf2f04b. * disable flakey tests on CI * wip * wip * Revert "Revert "move integration tests to cron"" This reverts commit66aafa7327. * fix * wip * fix --------- Co-authored-by: Brandon Williams <mbrandonw@hey.com> Co-authored-by: Mateusz Bąk <bakmatthew@icloud.com> Co-authored-by: Brandon Williams <135203+mbrandonw@users.noreply.github.com> Co-authored-by: Jesse Tipton <jesse@jessetipton.com>
99 lines
2.5 KiB
Swift
99 lines
2.5 KiB
Swift
import Combine
|
||
import ComposableArchitecture
|
||
import SwiftUI
|
||
import UIKit
|
||
|
||
@Reducer
|
||
struct Counter {
|
||
struct State: Equatable, Identifiable {
|
||
let id = UUID()
|
||
var count = 0
|
||
}
|
||
|
||
enum Action {
|
||
case decrementButtonTapped
|
||
case incrementButtonTapped
|
||
}
|
||
|
||
var body: some Reducer<State, Action> {
|
||
Reduce { state, action in
|
||
switch action {
|
||
case .decrementButtonTapped:
|
||
state.count -= 1
|
||
return .none
|
||
case .incrementButtonTapped:
|
||
state.count += 1
|
||
return .none
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
final class CounterViewController: UIViewController {
|
||
let store: StoreOf<Counter>
|
||
private var cancellables: Set<AnyCancellable> = []
|
||
|
||
init(store: StoreOf<Counter>) {
|
||
self.store = store
|
||
super.init(nibName: nil, bundle: nil)
|
||
}
|
||
|
||
required init?(coder: NSCoder) {
|
||
fatalError("init(coder:) has not been implemented")
|
||
}
|
||
|
||
override func viewDidLoad() {
|
||
super.viewDidLoad()
|
||
|
||
self.view.backgroundColor = .systemBackground
|
||
|
||
let decrementButton = UIButton(type: .system)
|
||
decrementButton.addTarget(self, action: #selector(decrementButtonTapped), for: .touchUpInside)
|
||
decrementButton.setTitle("−", for: .normal)
|
||
|
||
let countLabel = UILabel()
|
||
countLabel.font = .monospacedDigitSystemFont(ofSize: 17, weight: .regular)
|
||
|
||
let incrementButton = UIButton(type: .system)
|
||
incrementButton.addTarget(self, action: #selector(incrementButtonTapped), for: .touchUpInside)
|
||
incrementButton.setTitle("+", for: .normal)
|
||
|
||
let rootStackView = UIStackView(arrangedSubviews: [
|
||
decrementButton,
|
||
countLabel,
|
||
incrementButton,
|
||
])
|
||
rootStackView.translatesAutoresizingMaskIntoConstraints = false
|
||
self.view.addSubview(rootStackView)
|
||
|
||
NSLayoutConstraint.activate([
|
||
rootStackView.centerXAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.centerXAnchor),
|
||
rootStackView.centerYAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.centerYAnchor),
|
||
])
|
||
|
||
self.store.publisher
|
||
.map { "\($0.count)" }
|
||
.assign(to: \.text, on: countLabel)
|
||
.store(in: &self.cancellables)
|
||
}
|
||
|
||
@objc func decrementButtonTapped() {
|
||
self.store.send(.decrementButtonTapped)
|
||
}
|
||
|
||
@objc func incrementButtonTapped() {
|
||
self.store.send(.incrementButtonTapped)
|
||
}
|
||
}
|
||
|
||
struct CounterViewController_Previews: PreviewProvider {
|
||
static var previews: some View {
|
||
let vc = CounterViewController(
|
||
store: Store(initialState: Counter.State()) {
|
||
Counter()
|
||
}
|
||
)
|
||
return UIViewRepresented(makeUIView: { _ in vc.view })
|
||
}
|
||
}
|