Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
stephencelis committed Oct 17, 2023
1 parent ea395be commit 96b1bfc
Show file tree
Hide file tree
Showing 18 changed files with 1,101 additions and 0 deletions.

Large diffs are not rendered by default.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1500"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "2AD14E1B2ACDC3EC0015EB20"
BuildableName = "ObservationExplorations.app"
BlueprintName = "ObservationExplorations"
ReferencedContainer = "container:ObservationExplorations.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<TestPlans>
<TestPlanReference
reference = "container:ObservationExplorationsTests/ObservationExplorations.xctestplan"
default = "YES">
</TestPlanReference>
</TestPlans>
<Testables>
<TestableReference
skipped = "NO"
parallelizable = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "2AD14E2B2ACDC3ED0015EB20"
BuildableName = "ObservationExplorationsTests.xctest"
BlueprintName = "ObservationExplorationsTests"
ReferencedContainer = "container:ObservationExplorations.xcodeproj">
</BuildableReference>
</TestableReference>
<TestableReference
skipped = "NO"
parallelizable = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "2AD14E352ACDC3ED0015EB20"
BuildableName = "ObservationExplorationsUITests.xctest"
BlueprintName = "ObservationExplorationsUITests"
ReferencedContainer = "container:ObservationExplorations.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "2AD14E1B2ACDC3EC0015EB20"
BuildableName = "ObservationExplorations.app"
BlueprintName = "ObservationExplorations"
ReferencedContainer = "container:ObservationExplorations.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "2AD14E1B2ACDC3EC0015EB20"
BuildableName = "ObservationExplorations.app"
BlueprintName = "ObservationExplorations"
ReferencedContainer = "container:ObservationExplorations.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import SwiftUI

@Observable
class AppModel {
let tab1 = CounterModel()
let tab2 = CounterModel()
let tab3 = CounterModel()
}

struct AppView: View {
let model: AppModel

var body: some View {
let _ = Self._printChanges()

TabView {
NavigationStack {
CounterView(model: self.model.tab1)
.navigationTitle(Text("Counter 1"))
}
.badge(self.model.tab1.count)
.tabItem { Text("Counter 1") }

NavigationStack {
CounterView(model: self.model.tab2)
.navigationTitle(Text("Counter 2"))
}
.badge(self.model.tab2.count)
.tabItem { Text("Counter 2") }

NavigationStack {
CounterView(model: self.model.tab3)
.navigationTitle(Text("Counter 3"))
}
.badge(self.model.tab3.count)
.tabItem { Text("Counter 3") }
}
}
}

#Preview {
AppView(model: AppModel())
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import Combine
import SwiftUI

class AppModel_ObservableObject: ObservableObject {
@Published var tab1 = CounterModel_ObservableObject()
@Published var tab2 = CounterModel_ObservableObject()
@Published var tab3 = CounterModel_ObservableObject()

private var cancellables: Set<AnyCancellable> = []

init() {
self.tab1.$count.sink { [weak self] _ in
self?.objectWillChange.send()
}
.store(in: &self.cancellables)
self.tab2.objectWillChange.sink { [weak self] in
self?.objectWillChange.send()
}
.store(in: &self.cancellables)
self.tab3.objectWillChange.sink { [weak self] in
self?.objectWillChange.send()
}
.store(in: &self.cancellables)
}
}

struct AppView_ObservableObject: View {
@ObservedObject var model: AppModel_ObservableObject


var body: some View {
let _ = Self._printChanges()

TabView {
NavigationStack {
CounterView_ObservableObject(model: self.model.tab1)
.navigationTitle(Text("Counter 1"))
}
.badge(self.model.tab1.count)
.tabItem { Text("Counter 1") }

NavigationStack {
CounterView_ObservableObject(model: self.model.tab2)
.navigationTitle(Text("Counter 2"))
}
.tabItem { Text("Counter 2") }

NavigationStack {
CounterView_ObservableObject(model: self.model.tab3)
.navigationTitle(Text("Counter 3"))
}
.tabItem { Text("Counter 3") }
}
}
}

#Preview {
AppView_ObservableObject(model: AppModel_ObservableObject())
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"colors" : [
{
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"images" : [
{
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
import Observation
import SwiftUI

struct Angle {
var radians: Double
var degrees: Double {
@storageRestrictions(initializes: radians)
init(initialValue) {
self.radians = initialValue * .pi / 180
}
get { self.radians * 180 / .pi }
set { self.radians = newValue * .pi / 180 }
}
init(radians: Double) {
self.radians = radians
}
init(degrees: Double) {
self.degrees = degrees
}
}

@Observable
class CounterModel {
// private var _count
var count: Int = 0 {
didSet {
print("Count changed to", self.count)
}
}
var isDisplayingSecondsElapsed = true
var secondsElapsed = 0
private var timerTask: Task<Void, Error>?
var isTimerOn: Bool {
self.timerTask != nil
}

init() {
self.count = 0

@Sendable func observe() {
withObservationTracking {
_ = self.count
} onChange: {
Task {
print("Count changed to", self.count)
}
observe()
}
}
// observe()
}

func decrementButtonTapped() {
self.count -= 1
}
func incrementButtonTapped() {
self.count += 1
}

func startTimerButtonTapped() {
self.timerTask?.cancel()
self.timerTask = Task { @MainActor in
while true {
try await Task.sleep(for: .seconds(1))
self.secondsElapsed += 1
print("secondsElapsed", self.secondsElapsed)
}
}
}

func stopTimerButtonTapped() {
self.timerTask?.cancel()
self.timerTask = nil
}
}

struct CounterView: View {
@Bindable var model: CounterModel

var body: some View {
let _ = Self._printChanges()
Form {
Section {
Text(self.model.count.description)
Button("Decrement") { self.model.decrementButtonTapped() }
Button("Increment") { self.model.incrementButtonTapped() }
} header: {
Text("Counter")
}
Section {
if self.model.isDisplayingSecondsElapsed {
Text("Seconds elapsed: \(self.model.secondsElapsed)")
}
if !self.model.isTimerOn {
Button("Start timer") {
self.model.startTimerButtonTapped()
}
} else {
Button {
self.model.stopTimerButtonTapped()
} label: {
HStack {
Text("Stop timer")
Spacer()
ProgressView().id(UUID())
}
}
}
Toggle(isOn: self.$model.isDisplayingSecondsElapsed) {
Text("Observe seconds elapsed")
}
} header: {
Text("Timer")
}
}
}
}

#Preview {
CounterView(model: CounterModel())
}

struct ObservedView<Content: View>: View {
@State var id = UUID()
let content: () -> Content

var body: some View {
withObservationTracking {
content()
} onChange: {
self.id = UUID()
}
}
}
Loading

0 comments on commit 96b1bfc

Please sign in to comment.