Skip to content

Commit 240aafd

Browse files
authored
Support for strict concurrency (#133)
* Fix concurrency warnings unrelated to Sendable * Fix Sendable related warnings * Fix extra warnings * Fix tests
1 parent d9a42ba commit 240aafd

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+250
-191
lines changed

Examples/App.xcodeproj/project.pbxproj

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -317,10 +317,6 @@
317317
MACOSX_DEPLOYMENT_TARGET = 13.0;
318318
MTL_ENABLE_DEBUG_INFO = NO;
319319
MTL_FAST_MATH = YES;
320-
OTHER_SWIFT_FLAGS = (
321-
"-Xfrontend",
322-
"-enable-actor-data-race-checks",
323-
);
324320
PRODUCT_NAME = "$(TARGET_NAME)";
325321
SWIFT_COMPILATION_MODE = wholemodule;
326322
SWIFT_OPTIMIZATION_LEVEL = "-O";
@@ -438,10 +434,6 @@
438434
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
439435
MTL_FAST_MATH = YES;
440436
ONLY_ACTIVE_ARCH = YES;
441-
OTHER_SWIFT_FLAGS = (
442-
"-Xfrontend",
443-
"-enable-actor-data-race-checks",
444-
);
445437
PRODUCT_NAME = "$(TARGET_NAME)";
446438
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
447439
SWIFT_OPTIMIZATION_LEVEL = "-Onone";

Examples/App/CrossPlatform.swift

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
11
import CrossPlatformApp
2+
import SwiftUI
23

34
@main
4-
extension CrossPlatformApp {}
5+
struct CrossPlatformApp: App {
6+
var body: some Scene {
7+
WindowGroup {
8+
CrossPlatformRoot()
9+
}
10+
}
11+
}

Examples/App/iOS.swift

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
1+
import SwiftUI
12
import iOSApp
23

34
@main
4-
extension iOSApp {}
5+
struct iOSApp: App {
6+
var body: some Scene {
7+
WindowGroup {
8+
iOSRoot()
9+
}
10+
}
11+
}

Examples/Packages/CrossPlatform/Package.swift

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,27 @@
1-
// swift-tools-version:5.8
1+
// swift-tools-version:5.9
22

33
import PackageDescription
44

5-
let atoms = Target.Dependency.product(name: "Atoms", package: "swiftui-atom-properties")
5+
let swiftSettings: [SwiftSetting] = [
6+
.unsafeFlags(["-Xfrontend", "-strict-concurrency=complete"]),
7+
.unsafeFlags(["-Xfrontend", "-enable-actor-data-race-checks"]),
8+
]
9+
10+
func target(name: String, dependencies: [Target.Dependency] = []) -> Target {
11+
.target(
12+
name: name,
13+
dependencies: [.product(name: "Atoms", package: "swiftui-atom-properties")] + dependencies,
14+
swiftSettings: swiftSettings
15+
)
16+
}
17+
18+
func testTarget(name: String, dependencies: [Target.Dependency]) -> Target {
19+
.testTarget(
20+
name: name,
21+
dependencies: dependencies,
22+
swiftSettings: swiftSettings
23+
)
24+
}
625

726
let package = Package(
827
name: "CrossPlatformExamples",
@@ -19,16 +38,16 @@ let package = Package(
1938
.package(path: "../../..")
2039
],
2140
targets: [
22-
.target(
41+
target(
2342
name: "CrossPlatformApp",
2443
dependencies: [
2544
"ExampleCounter",
2645
"ExampleTodo",
2746
]
2847
),
29-
.target(name: "ExampleCounter", dependencies: [atoms]),
30-
.testTarget(name: "ExampleCounterTests", dependencies: ["ExampleCounter"]),
31-
.target(name: "ExampleTodo", dependencies: [atoms]),
32-
.testTarget(name: "ExampleTodoTests", dependencies: ["ExampleTodo"]),
48+
target(name: "ExampleCounter"),
49+
testTarget(name: "ExampleCounterTests", dependencies: ["ExampleCounter"]),
50+
target(name: "ExampleTodo"),
51+
testTarget(name: "ExampleTodoTests", dependencies: ["ExampleTodo"]),
3352
]
3453
)

Examples/Packages/CrossPlatform/Sources/CrossPlatformApp/CrossPlatformApp.swift

Lines changed: 0 additions & 32 deletions
This file was deleted.
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import Atoms
2+
import ExampleCounter
3+
import ExampleTodo
4+
import SwiftUI
5+
6+
// swift-format-ignore: AllPublicDeclarationsHaveDocumentation
7+
public struct CrossPlatformRoot: View {
8+
public init() {}
9+
10+
public var body: some View {
11+
AtomRoot {
12+
NavigationStack {
13+
List {
14+
NavigationLink("🔢 Counter") {
15+
ExampleCounter()
16+
}
17+
18+
NavigationLink("📋 Todo") {
19+
ExampleTodo()
20+
}
21+
}
22+
.navigationTitle("Examples")
23+
24+
#if os(iOS)
25+
.listStyle(.insetGrouped)
26+
#endif
27+
}
28+
}
29+
}
30+
}

Examples/Packages/CrossPlatform/Sources/ExampleTodo/Views.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,10 @@ struct TodoCreator: View {
6666
.textFieldStyle(.roundedBorder)
6767
#endif
6868

69-
Button("Add", action: addTodo)
70-
.disabled(text.isEmpty)
69+
Button("Add") {
70+
addTodo()
71+
}
72+
.disabled(text.isEmpty)
7173
}
7274
.padding(.vertical)
7375
}
Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,27 @@
1-
// swift-tools-version:5.8
1+
// swift-tools-version:5.9
22

33
import PackageDescription
44

5-
let atoms = Target.Dependency.product(name: "Atoms", package: "swiftui-atom-properties")
5+
let swiftSettings: [SwiftSetting] = [
6+
.unsafeFlags(["-Xfrontend", "-strict-concurrency=complete"]),
7+
.unsafeFlags(["-Xfrontend", "-enable-actor-data-race-checks"]),
8+
]
9+
10+
func target(name: String, dependencies: [Target.Dependency] = []) -> Target {
11+
.target(
12+
name: name,
13+
dependencies: [.product(name: "Atoms", package: "swiftui-atom-properties")] + dependencies,
14+
swiftSettings: swiftSettings
15+
)
16+
}
17+
18+
func testTarget(name: String, dependencies: [Target.Dependency]) -> Target {
19+
.testTarget(
20+
name: name,
21+
dependencies: dependencies,
22+
swiftSettings: swiftSettings
23+
)
24+
}
625

726
let package = Package(
827
name: "iOSExamples",
@@ -17,7 +36,7 @@ let package = Package(
1736
.package(path: "../CrossPlatform"),
1837
],
1938
targets: [
20-
.target(
39+
target(
2140
name: "iOSApp",
2241
dependencies: [
2342
.product(name: "CrossPlatformApp", package: "CrossPlatform"),
@@ -27,13 +46,13 @@ let package = Package(
2746
"ExampleTimeTravel",
2847
]
2948
),
30-
.target(name: "ExampleMovieDB", dependencies: [atoms]),
31-
.testTarget(name: "ExampleMovieDBTests", dependencies: ["ExampleMovieDB"]),
32-
.target(name: "ExampleMap", dependencies: [atoms]),
33-
.testTarget(name: "ExampleMapTests", dependencies: ["ExampleMap"]),
34-
.target(name: "ExampleVoiceMemo", dependencies: [atoms]),
35-
.testTarget(name: "ExampleVoiceMemoTests", dependencies: ["ExampleVoiceMemo"]),
36-
.target(name: "ExampleTimeTravel", dependencies: [atoms]),
37-
.testTarget(name: "ExampleTimeTravelTests", dependencies: ["ExampleTimeTravel"]),
49+
target(name: "ExampleMovieDB"),
50+
testTarget(name: "ExampleMovieDBTests", dependencies: ["ExampleMovieDB"]),
51+
target(name: "ExampleMap"),
52+
testTarget(name: "ExampleMapTests", dependencies: ["ExampleMap"]),
53+
target(name: "ExampleVoiceMemo"),
54+
testTarget(name: "ExampleVoiceMemoTests", dependencies: ["ExampleVoiceMemo"]),
55+
target(name: "ExampleTimeTravel"),
56+
testTarget(name: "ExampleTimeTravelTests", dependencies: ["ExampleTimeTravel"]),
3857
]
3958
)

Examples/Packages/iOS/Sources/ExampleMap/Atoms.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import Atoms
22
import CoreLocation
33

4-
final class LocationObserver: NSObject, ObservableObject, CLLocationManagerDelegate {
4+
final class LocationObserver: NSObject, ObservableObject, CLLocationManagerDelegate, @unchecked Sendable {
55
let manager: LocationManagerProtocol
66

77
deinit {

Examples/Packages/iOS/Sources/ExampleMap/Dependency/LocationManager.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ protocol LocationManagerProtocol: AnyObject {
1111

1212
extension CLLocationManager: LocationManagerProtocol {}
1313

14-
final class MockLocationManager: LocationManagerProtocol {
14+
final class MockLocationManager: LocationManagerProtocol, @unchecked Sendable {
1515
weak var delegate: CLLocationManagerDelegate?
1616
var desiredAccuracy = kCLLocationAccuracyKilometer
1717
var location: CLLocation? = nil

0 commit comments

Comments
 (0)