From 62d38fb5fe0691fa263c9a77db3615301268aa01 Mon Sep 17 00:00:00 2001 From: ra1028 Date: Tue, 8 Oct 2024 21:13:08 +0900 Subject: [PATCH 1/2] Enable ExistentialAny --- Examples/Packages/CrossPlatform/Package.swift | 14 +++++++----- Examples/Packages/iOS/Package.swift | 22 +++++++++++-------- .../iOS/Sources/ExampleMap/Atoms.swift | 8 +++---- .../Dependency/LocationManager.swift | 4 ++-- .../ExampleMovieDB/Atoms/CommonAtoms.swift | 2 +- .../ExampleMovieDB/Atoms/MoviesAtoms.swift | 6 ++--- .../ExampleMovieDB/Backend/APIClient.swift | 8 +++---- .../ExampleMovieDB/Entities/Failable.swift | 6 ++--- .../ExampleMovieDB/Views/CastList.swift | 2 +- .../ExampleMovieDB/Views/NetworkImage.swift | 2 +- .../Atoms/VoiceMemoListAtoms.swift | 6 ++--- .../Atoms/VoiceMemoRowAtoms.swift | 2 +- .../Dependency/AudioPlayer.swift | 4 ++-- .../Dependency/AudioRecorder.swift | 4 ++-- Package.swift | 12 ++++++++-- README.md | 22 +++++++++---------- Sources/Atoms/Atom/AsyncSequenceAtom.swift | 4 ++-- Sources/Atoms/Atom/ThrowingTaskAtom.swift | 4 ++-- .../Atoms/Modifier/ChangesOfModifier.swift | 10 ++++----- .../Atoms/Modifier/TaskPhaseModifier.swift | 2 +- Sources/Atoms/Suspense.swift | 10 ++++----- Tests/AtomsTests/AsyncPhaseTests.swift | 2 +- .../Atom/ThrowingTaskAtomTests.swift | 4 ++-- .../AtomsTests/Context/AtomContextTests.swift | 2 +- Tests/AtomsTests/Utilities/TestAtom.swift | 2 +- Tests/AtomsTests/Utilities/Utilities.swift | 6 ++--- 26 files changed, 93 insertions(+), 77 deletions(-) diff --git a/Examples/Packages/CrossPlatform/Package.swift b/Examples/Packages/CrossPlatform/Package.swift index f7acdf17..2047920c 100644 --- a/Examples/Packages/CrossPlatform/Package.swift +++ b/Examples/Packages/CrossPlatform/Package.swift @@ -3,6 +3,9 @@ import PackageDescription let atoms = Target.Dependency.product(name: "Atoms", package: "swiftui-atom-properties") +let swiftSettings: [SwiftSetting] = [ + .enableUpcomingFeature("ExistentialAny"), +] let package = Package( name: "CrossPlatformExamples", @@ -25,11 +28,12 @@ let package = Package( atoms, "ExampleCounter", "ExampleTodo", - ] + ], + swiftSettings: swiftSettings ), - .target(name: "ExampleCounter", dependencies: [atoms]), - .testTarget(name: "ExampleCounterTests", dependencies: ["ExampleCounter"]), - .target(name: "ExampleTodo", dependencies: [atoms]), - .testTarget(name: "ExampleTodoTests", dependencies: ["ExampleTodo"]), + .target(name: "ExampleCounter", dependencies: [atoms], swiftSettings: swiftSettings), + .testTarget(name: "ExampleCounterTests", dependencies: ["ExampleCounter"], swiftSettings: swiftSettings), + .target(name: "ExampleTodo", dependencies: [atoms], swiftSettings: swiftSettings), + .testTarget(name: "ExampleTodoTests", dependencies: ["ExampleTodo"], swiftSettings: swiftSettings), ] ) diff --git a/Examples/Packages/iOS/Package.swift b/Examples/Packages/iOS/Package.swift index 653f36c0..c5ef56fc 100644 --- a/Examples/Packages/iOS/Package.swift +++ b/Examples/Packages/iOS/Package.swift @@ -3,6 +3,9 @@ import PackageDescription let atoms = Target.Dependency.product(name: "Atoms", package: "swiftui-atom-properties") +let swiftSettings: [SwiftSetting] = [ + .enableUpcomingFeature("ExistentialAny"), +] let package = Package( name: "iOSExamples", @@ -26,15 +29,16 @@ let package = Package( "ExampleMap", "ExampleVoiceMemo", "ExampleTimeTravel", - ] + ], + swiftSettings: swiftSettings ), - .target(name: "ExampleMovieDB", dependencies: [atoms]), - .testTarget(name: "ExampleMovieDBTests", dependencies: ["ExampleMovieDB"]), - .target(name: "ExampleMap", dependencies: [atoms]), - .testTarget(name: "ExampleMapTests", dependencies: ["ExampleMap"]), - .target(name: "ExampleVoiceMemo", dependencies: [atoms]), - .testTarget(name: "ExampleVoiceMemoTests", dependencies: ["ExampleVoiceMemo"]), - .target(name: "ExampleTimeTravel", dependencies: [atoms]), - .testTarget(name: "ExampleTimeTravelTests", dependencies: ["ExampleTimeTravel"]), + .target(name: "ExampleMovieDB", dependencies: [atoms], swiftSettings: swiftSettings), + .testTarget(name: "ExampleMovieDBTests", dependencies: ["ExampleMovieDB"], swiftSettings: swiftSettings), + .target(name: "ExampleMap", dependencies: [atoms], swiftSettings: swiftSettings), + .testTarget(name: "ExampleMapTests", dependencies: ["ExampleMap"], swiftSettings: swiftSettings), + .target(name: "ExampleVoiceMemo", dependencies: [atoms], swiftSettings: swiftSettings), + .testTarget(name: "ExampleVoiceMemoTests", dependencies: ["ExampleVoiceMemo"], swiftSettings: swiftSettings), + .target(name: "ExampleTimeTravel", dependencies: [atoms], swiftSettings: swiftSettings), + .testTarget(name: "ExampleTimeTravelTests", dependencies: ["ExampleTimeTravel"], swiftSettings: swiftSettings), ] ) diff --git a/Examples/Packages/iOS/Sources/ExampleMap/Atoms.swift b/Examples/Packages/iOS/Sources/ExampleMap/Atoms.swift index d04d2403..c3836c8e 100644 --- a/Examples/Packages/iOS/Sources/ExampleMap/Atoms.swift +++ b/Examples/Packages/iOS/Sources/ExampleMap/Atoms.swift @@ -2,13 +2,13 @@ import Atoms import CoreLocation final class LocationObserver: NSObject, ObservableObject, CLLocationManagerDelegate, @unchecked Sendable { - let manager: LocationManagerProtocol + let manager: any LocationManagerProtocol deinit { manager.stopUpdatingLocation() } - init(manager: LocationManagerProtocol) { + init(manager: any LocationManagerProtocol) { self.manager = manager super.init() manager.delegate = self @@ -32,13 +32,13 @@ final class LocationObserver: NSObject, ObservableObject, CLLocationManagerDeleg } } - func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) { + func locationManager(_ manager: CLLocationManager, didFailWithError error: any Error) { print(error.localizedDescription) } } struct LocationManagerAtom: ValueAtom, Hashable { - func value(context: Context) -> LocationManagerProtocol { + func value(context: Context) -> any LocationManagerProtocol { let manager = CLLocationManager() manager.desiredAccuracy = kCLLocationAccuracyBest return manager diff --git a/Examples/Packages/iOS/Sources/ExampleMap/Dependency/LocationManager.swift b/Examples/Packages/iOS/Sources/ExampleMap/Dependency/LocationManager.swift index 61d89e22..437b80ed 100644 --- a/Examples/Packages/iOS/Sources/ExampleMap/Dependency/LocationManager.swift +++ b/Examples/Packages/iOS/Sources/ExampleMap/Dependency/LocationManager.swift @@ -1,7 +1,7 @@ import CoreLocation protocol LocationManagerProtocol: AnyObject { - var delegate: CLLocationManagerDelegate? { get set } + var delegate: (any CLLocationManagerDelegate)? { get set } var desiredAccuracy: CLLocationAccuracy { get set } var location: CLLocation? { get } var authorizationStatus: CLAuthorizationStatus { get } @@ -12,7 +12,7 @@ protocol LocationManagerProtocol: AnyObject { extension CLLocationManager: LocationManagerProtocol {} final class MockLocationManager: LocationManagerProtocol, @unchecked Sendable { - weak var delegate: CLLocationManagerDelegate? + weak var delegate: (any CLLocationManagerDelegate)? var desiredAccuracy = kCLLocationAccuracyKilometer var location: CLLocation? = nil var authorizationStatus = CLAuthorizationStatus.notDetermined diff --git a/Examples/Packages/iOS/Sources/ExampleMovieDB/Atoms/CommonAtoms.swift b/Examples/Packages/iOS/Sources/ExampleMovieDB/Atoms/CommonAtoms.swift index e92af8ef..258b99ad 100644 --- a/Examples/Packages/iOS/Sources/ExampleMovieDB/Atoms/CommonAtoms.swift +++ b/Examples/Packages/iOS/Sources/ExampleMovieDB/Atoms/CommonAtoms.swift @@ -2,7 +2,7 @@ import Atoms import UIKit struct APIClientAtom: ValueAtom, Hashable { - func value(context: Context) -> APIClientProtocol { + func value(context: Context) -> any APIClientProtocol { APIClient() } } diff --git a/Examples/Packages/iOS/Sources/ExampleMovieDB/Atoms/MoviesAtoms.swift b/Examples/Packages/iOS/Sources/ExampleMovieDB/Atoms/MoviesAtoms.swift index 5cc8c3fa..eeb6e98c 100644 --- a/Examples/Packages/iOS/Sources/ExampleMovieDB/Atoms/MoviesAtoms.swift +++ b/Examples/Packages/iOS/Sources/ExampleMovieDB/Atoms/MoviesAtoms.swift @@ -4,11 +4,11 @@ import Foundation @MainActor final class MovieLoader: ObservableObject { @Published - private(set) var pages = AsyncPhase<[PagedResponse], Error>.suspending - private let api: APIClientProtocol + private(set) var pages = AsyncPhase<[PagedResponse], any Error>.suspending + private let api: any APIClientProtocol let filter: Filter - init(api: APIClientProtocol, filter: Filter) { + init(api: any APIClientProtocol, filter: Filter) { self.api = api self.filter = filter } diff --git a/Examples/Packages/iOS/Sources/ExampleMovieDB/Backend/APIClient.swift b/Examples/Packages/iOS/Sources/ExampleMovieDB/Backend/APIClient.swift index 64acd94f..07cacf04 100644 --- a/Examples/Packages/iOS/Sources/ExampleMovieDB/Backend/APIClient.swift +++ b/Examples/Packages/iOS/Sources/ExampleMovieDB/Backend/APIClient.swift @@ -95,10 +95,10 @@ private extension APIClient { } final class MockAPIClient: APIClientProtocol, @unchecked Sendable { - var imageResponse = Result.failure(URLError(.unknown)) - var filteredMovieResponse = Result, Error>.failure(URLError(.unknown)) - var creditsResponse = Result.failure(URLError(.unknown)) - var searchMoviesResponse = Result, Error>.failure(URLError(.unknown)) + var imageResponse = Result.failure(URLError(.unknown)) + var filteredMovieResponse = Result, any Error>.failure(URLError(.unknown)) + var creditsResponse = Result.failure(URLError(.unknown)) + var searchMoviesResponse = Result, any Error>.failure(URLError(.unknown)) func getImage(path: String, size: ImageSize) async throws -> UIImage { try imageResponse.get() diff --git a/Examples/Packages/iOS/Sources/ExampleMovieDB/Entities/Failable.swift b/Examples/Packages/iOS/Sources/ExampleMovieDB/Entities/Failable.swift index fcf31f06..faaa3d68 100644 --- a/Examples/Packages/iOS/Sources/ExampleMovieDB/Entities/Failable.swift +++ b/Examples/Packages/iOS/Sources/ExampleMovieDB/Entities/Failable.swift @@ -1,12 +1,12 @@ @propertyWrapper -struct Failable: Decodable & Sendable { +struct Failable: Decodable, Sendable { var wrappedValue: T? init(wrappedValue: T?) { self.wrappedValue = wrappedValue } - init(from decoder: Decoder) throws { + init(from decoder: any Decoder) throws { let container = try decoder.singleValueContainer() let wrappedValue = try? container.decode(T.self) self.init(wrappedValue: wrappedValue) @@ -14,7 +14,7 @@ struct Failable: Decodable & Sendable { } extension Failable: Encodable where T: Encodable { - func encode(to encoder: Encoder) throws { + func encode(to encoder: any Encoder) throws { var container = encoder.singleValueContainer() try container.encode(wrappedValue) } diff --git a/Examples/Packages/iOS/Sources/ExampleMovieDB/Views/CastList.swift b/Examples/Packages/iOS/Sources/ExampleMovieDB/Views/CastList.swift index 64755f97..06394467 100644 --- a/Examples/Packages/iOS/Sources/ExampleMovieDB/Views/CastList.swift +++ b/Examples/Packages/iOS/Sources/ExampleMovieDB/Views/CastList.swift @@ -7,7 +7,7 @@ struct CastList: View { @ViewContext var context - var casts: AsyncPhase<[Credits.Person], Error> { + var casts: AsyncPhase<[Credits.Person], any Error> { context.watch(CastsAtom(movieID: movieID).phase) } diff --git a/Examples/Packages/iOS/Sources/ExampleMovieDB/Views/NetworkImage.swift b/Examples/Packages/iOS/Sources/ExampleMovieDB/Views/NetworkImage.swift index 1677cce7..7569469f 100644 --- a/Examples/Packages/iOS/Sources/ExampleMovieDB/Views/NetworkImage.swift +++ b/Examples/Packages/iOS/Sources/ExampleMovieDB/Views/NetworkImage.swift @@ -8,7 +8,7 @@ struct NetworkImage: View { @ViewContext var context - var image: Task { + var image: Task { context.watch(ImageAtom(path: path, size: size)) } diff --git a/Examples/Packages/iOS/Sources/ExampleVoiceMemo/Atoms/VoiceMemoListAtoms.swift b/Examples/Packages/iOS/Sources/ExampleVoiceMemo/Atoms/VoiceMemoListAtoms.swift index 60b7523f..9da6a393 100644 --- a/Examples/Packages/iOS/Sources/ExampleVoiceMemo/Atoms/VoiceMemoListAtoms.swift +++ b/Examples/Packages/iOS/Sources/ExampleVoiceMemo/Atoms/VoiceMemoListAtoms.swift @@ -17,7 +17,7 @@ struct RecordingData: Equatable { @MainActor struct VoiceMemoActions { - let context: AtomContext + let context: any AtomContext func toggleRecording() { let isRecording = context.read(IsRecordingAtom()) @@ -68,13 +68,13 @@ struct VoiceMemoActionsAtom: ValueAtom, Hashable { } struct AudioSessionAtom: ValueAtom, Hashable { - func value(context: Context) -> AudioSessionProtocol { + func value(context: Context) -> any AudioSessionProtocol { AVAudioSession.sharedInstance() } } struct AudioRecorderAtom: ValueAtom, Hashable { - func value(context: Context) -> AudioRecorderProtocol { + func value(context: Context) -> any AudioRecorderProtocol { AudioRecorder { context[IsRecordingFailedAtom()] = true context[RecordingDataAtom()] = nil diff --git a/Examples/Packages/iOS/Sources/ExampleVoiceMemo/Atoms/VoiceMemoRowAtoms.swift b/Examples/Packages/iOS/Sources/ExampleVoiceMemo/Atoms/VoiceMemoRowAtoms.swift index 69caacf9..b1b0c236 100644 --- a/Examples/Packages/iOS/Sources/ExampleVoiceMemo/Atoms/VoiceMemoRowAtoms.swift +++ b/Examples/Packages/iOS/Sources/ExampleVoiceMemo/Atoms/VoiceMemoRowAtoms.swift @@ -62,7 +62,7 @@ struct AudioPlayerAtom: ValueAtom { voiceMemo.url } - func value(context: Context) -> AudioPlayerProtocol { + func value(context: Context) -> any AudioPlayerProtocol { AudioPlayer( onFinish: { context[IsPlayingAtom(voiceMemo: voiceMemo)] = false diff --git a/Examples/Packages/iOS/Sources/ExampleVoiceMemo/Dependency/AudioPlayer.swift b/Examples/Packages/iOS/Sources/ExampleVoiceMemo/Dependency/AudioPlayer.swift index 61afcf83..4be792b6 100644 --- a/Examples/Packages/iOS/Sources/ExampleVoiceMemo/Dependency/AudioPlayer.swift +++ b/Examples/Packages/iOS/Sources/ExampleVoiceMemo/Dependency/AudioPlayer.swift @@ -36,14 +36,14 @@ final class AudioPlayer: NSObject, AVAudioPlayerDelegate, AudioPlayerProtocol { } } - func audioPlayerDecodeErrorDidOccur(_ player: AVAudioPlayer, error: Error?) { + func audioPlayerDecodeErrorDidOccur(_ player: AVAudioPlayer, error: (any Error)?) { onFail() } } final class MockAudioPlayer: AudioPlayerProtocol, @unchecked Sendable { private(set) var isPlaying = false - var playingError: Error? + var playingError: (any Error)? func play(url: URL) throws { if let playingError = playingError { diff --git a/Examples/Packages/iOS/Sources/ExampleVoiceMemo/Dependency/AudioRecorder.swift b/Examples/Packages/iOS/Sources/ExampleVoiceMemo/Dependency/AudioRecorder.swift index 5b1a7ab6..3e7d0f09 100644 --- a/Examples/Packages/iOS/Sources/ExampleVoiceMemo/Dependency/AudioRecorder.swift +++ b/Examples/Packages/iOS/Sources/ExampleVoiceMemo/Dependency/AudioRecorder.swift @@ -45,14 +45,14 @@ final class AudioRecorder: NSObject, AVAudioRecorderDelegate, AudioRecorderProto } } - func audioRecorderEncodeErrorDidOccur(_ recorder: AVAudioRecorder, error: Error?) { + func audioRecorderEncodeErrorDidOccur(_ recorder: AVAudioRecorder, error: (any Error)?) { onFail() } } final class MockAudioRecorder: AudioRecorderProtocol, @unchecked Sendable { var isRecording = false - var recordingError: Error? + var recordingError: (any Error)? var currentTime: TimeInterval = 10 func record(url: URL) throws { diff --git a/Package.swift b/Package.swift index c7df51cc..b51ee33f 100644 --- a/Package.swift +++ b/Package.swift @@ -2,6 +2,10 @@ import PackageDescription +let swiftSettings: [SwiftSetting] = [ + .enableUpcomingFeature("ExistentialAny"), +] + let package = Package( name: "swiftui-atom-properties", platforms: [ @@ -14,10 +18,14 @@ let package = Package( .library(name: "Atoms", targets: ["Atoms"]) ], targets: [ - .target(name: "Atoms"), + .target( + name: "Atoms", + swiftSettings: swiftSettings + ), .testTarget( name: "AtomsTests", - dependencies: ["Atoms"] + dependencies: ["Atoms"], + swiftSettings: swiftSettings ), ], swiftLanguageModes: [.v5, .v6] diff --git a/README.md b/README.md index ac673874..751862ff 100644 --- a/README.md +++ b/README.md @@ -482,7 +482,7 @@ struct UserView: View { | |Description| |:----------|:----------| |Summary |Initiates a throwing `Task` from the given `async throws` function.| -|Output |`Task`| +|Output |`Task`| |Use Case |Throwing asynchronous operation e.g. API call|
📖 Example @@ -519,7 +519,7 @@ struct MoviesView: View { | |Description| |:----------|:----------| |Summary |Provides a `AsyncPhase` value that represents asynchronous, sequential elements of the given `AsyncSequence`.| -|Output |`AsyncPhase`| +|Output |`AsyncPhase`| |Use Case |Handle multiple asynchronous values e.g. web-sockets|
📖 Example @@ -744,7 +744,7 @@ struct FetchWeatherAtom: ThrowingTaskAtom, Hashable { struct WeatherReportView: View { @Watch(FetchWeatherAtom().phase) - var weatherPhase // : AsyncPhase + var weatherPhase // : AsyncPhase var body: some View { switch weatherPhase { @@ -833,11 +833,11 @@ private struct FetchMoviesTaskAtom: ThrowingTaskAtom, Hashable { } struct FetchMoviesPhaseAtom: ValueAtom, Refreshable, Hashable { - func value(context: Context) -> AsyncPhase<[Movies], Error> { + func value(context: Context) -> AsyncPhase<[Movies], any Error> { context.watch(FetchMoviesTaskAtom().phase) } - func refresh(context: CurrentContext) async -> AsyncPhase<[Movies], Error> { + func refresh(context: CurrentContext) async -> AsyncPhase<[Movies], any Error> { await context.refresh(FetchMoviesTaskAtom().phase) } @@ -1093,7 +1093,7 @@ struct BooksView: View { var body: some View { // watch - let booksTask = context.watch(FetchBooksAtom()) // Task<[Book], Error> + let booksTask = context.watch(FetchBooksAtom()) // Task<[Book], any Error> // binding let searchQuery = context.binding(SearchQueryAtom()) // Binding @@ -1159,7 +1159,7 @@ struct LocationManagerDelegateAtom: ValueAtom, Hashable { } struct LocationManagerAtom: ValueAtom, Hashable { - func value(context: Context) -> LocationManagerProtocol { + func value(context: Context) -> any LocationManagerProtocol { let delegate = context.watch(LocationManagerDelegateAtom()) let manager = CLLocationManager() manager.delegate = delegate @@ -1194,7 +1194,7 @@ struct APIClient: APIClientProtocol { ... } struct MockAPIClient: APIClientProtocol { ... } struct APIClientAtom: ValueAtom, Hashable { - func value(context: Context) -> APIClientProtocol { + func value(context: Context) -> any APIClientProtocol { APIClient() } } @@ -1252,7 +1252,7 @@ Optionally, you can pass `suspending` content to be displayed until the task com ```swift struct NewsView: View { @Watch(LatestNewsAtom()) - var newsTask: Task + var newsTask: Task var body: some View { Suspense(newsTask) { news in @@ -1486,7 +1486,7 @@ class MockAPIClient: APIClientProtocol { } struct APIClientAtom: ValueAtom, Hashable { - func value(context: Context) -> APIClientProtocol { + func value(context: Context) -> any APIClientProtocol { APIClient() } } @@ -1715,7 +1715,7 @@ class MessageLoader: ObservableObject { let context: AtomContext @Published - var phase = AsyncPhase<[Message], Error>.suspending + var phase = AsyncPhase<[Message], any Error>.suspending init(context: AtomContext) { self.context = context diff --git a/Sources/Atoms/Atom/AsyncSequenceAtom.swift b/Sources/Atoms/Atom/AsyncSequenceAtom.swift index cd978939..4292061d 100644 --- a/Sources/Atoms/Atom/AsyncSequenceAtom.swift +++ b/Sources/Atoms/Atom/AsyncSequenceAtom.swift @@ -8,7 +8,7 @@ /// /// ## Output Value /// -/// ``AsyncPhase`` +/// ``AsyncPhase`` /// /// ## Example /// @@ -44,7 +44,7 @@ /// } /// ``` /// -public protocol AsyncSequenceAtom: AsyncAtom where Produced == AsyncPhase { +public protocol AsyncSequenceAtom: AsyncAtom where Produced == AsyncPhase { /// The type of asynchronous sequence that this atom manages. associatedtype Sequence: AsyncSequence where Sequence.Element: Sendable diff --git a/Sources/Atoms/Atom/ThrowingTaskAtom.swift b/Sources/Atoms/Atom/ThrowingTaskAtom.swift index 0a77070a..7404444c 100644 --- a/Sources/Atoms/Atom/ThrowingTaskAtom.swift +++ b/Sources/Atoms/Atom/ThrowingTaskAtom.swift @@ -8,7 +8,7 @@ /// /// ## Output Value /// -/// Task +/// Task /// /// ## Example /// @@ -36,7 +36,7 @@ /// } /// ``` /// -public protocol ThrowingTaskAtom: AsyncAtom where Produced == Task { +public protocol ThrowingTaskAtom: AsyncAtom where Produced == Task { /// The type of success value that this atom produces. associatedtype Success: Sendable diff --git a/Sources/Atoms/Modifier/ChangesOfModifier.swift b/Sources/Atoms/Modifier/ChangesOfModifier.swift index 68ae5271..745062e9 100644 --- a/Sources/Atoms/Modifier/ChangesOfModifier.swift +++ b/Sources/Atoms/Modifier/ChangesOfModifier.swift @@ -24,7 +24,7 @@ public extension Atom { /// - Returns: An atom that provides the partial property of the original atom value. #if compiler(>=6) || hasFeature(InferSendableFromCaptures) func changes( - of keyPath: KeyPath & Sendable + of keyPath: any KeyPath & Sendable ) -> ModifiedAtom> { modifier(ChangesOfModifier(keyPath: keyPath)) } @@ -51,16 +51,16 @@ public struct ChangesOfModifier: AtomModifier { #if compiler(>=6) || hasFeature(InferSendableFromCaptures) /// A type representing the stable identity of this modifier. public struct Key: Hashable, Sendable { - private let keyPath: KeyPath & Sendable + private let keyPath: any KeyPath & Sendable - fileprivate init(keyPath: KeyPath & Sendable) { + fileprivate init(keyPath: any KeyPath & Sendable) { self.keyPath = keyPath } } - private let keyPath: KeyPath & Sendable + private let keyPath: any KeyPath & Sendable - internal init(keyPath: KeyPath & Sendable) { + internal init(keyPath: any KeyPath & Sendable) { self.keyPath = keyPath } diff --git a/Sources/Atoms/Modifier/TaskPhaseModifier.swift b/Sources/Atoms/Modifier/TaskPhaseModifier.swift index 5cf3608d..6e7526df 100644 --- a/Sources/Atoms/Modifier/TaskPhaseModifier.swift +++ b/Sources/Atoms/Modifier/TaskPhaseModifier.swift @@ -62,7 +62,7 @@ public extension ThrowingTaskAtom { /// } /// ``` /// - var phase: ModifiedAtom> { + var phase: ModifiedAtom> { modifier(TaskPhaseModifier()) } } diff --git a/Sources/Atoms/Suspense.swift b/Sources/Atoms/Suspense.swift index 2c84f652..b0c07476 100644 --- a/Sources/Atoms/Suspense.swift +++ b/Sources/Atoms/Suspense.swift @@ -13,7 +13,7 @@ import SwiftUI /// ## Example /// /// ```swift -/// let fetchImageTask: Task = ... +/// let fetchImageTask: Task = ... /// /// Suspense(fetchImageTask) { uiImage in /// // Displays content when the task successfully provides a value. @@ -40,7 +40,7 @@ public struct Suspense = ... + /// let fetchImageTask: Task = ... /// /// Suspense(fetchImageTask) { uiImage in /// Image(uiImage: uiImage) @@ -72,7 +72,7 @@ public struct Suspense = ... + /// let fetchImageTask: Task = ... /// /// Suspense(fetchImageTask) { uiImage in /// Image(uiImage: uiImage) @@ -98,7 +98,7 @@ public struct Suspense = ... + /// let fetchImageTask: Task = ... /// /// Suspense(fetchImageTask) { uiImage in /// Image(uiImage: uiImage) @@ -128,7 +128,7 @@ public struct Suspense = ... + /// let fetchImageTask: Task = ... /// /// Suspense(fetchImageTask) { uiImage in /// Image(uiImage: uiImage) diff --git a/Tests/AtomsTests/AsyncPhaseTests.swift b/Tests/AtomsTests/AsyncPhaseTests.swift index 9ddf2379..f56dde4b 100644 --- a/Tests/AtomsTests/AsyncPhaseTests.swift +++ b/Tests/AtomsTests/AsyncPhaseTests.swift @@ -86,7 +86,7 @@ final class AsyncPhaseTests: XCTestCase { } func testMap() { - let phase = AsyncPhase.success(0) + let phase = AsyncPhase.success(0) .map(String.init) XCTAssertEqual(phase.value, "0") diff --git a/Tests/AtomsTests/Atom/ThrowingTaskAtomTests.swift b/Tests/AtomsTests/Atom/ThrowingTaskAtomTests.swift index f3e785f8..e9ce70c4 100644 --- a/Tests/AtomsTests/Atom/ThrowingTaskAtomTests.swift +++ b/Tests/AtomsTests/Atom/ThrowingTaskAtomTests.swift @@ -5,7 +5,7 @@ import XCTest final class ThrowingTaskAtomTests: XCTestCase { @MainActor func test() async throws { - var result = Result.success(0) + var result = Result.success(0) let atom = TestThrowingTaskAtom { result } let context = AtomTestContext() @@ -58,7 +58,7 @@ final class ThrowingTaskAtomTests: XCTestCase { @MainActor func testRefresh() async throws { - var result = Result.success(0) + var result = Result.success(0) let atom = TestThrowingTaskAtom { result } let context = AtomTestContext() diff --git a/Tests/AtomsTests/Context/AtomContextTests.swift b/Tests/AtomsTests/Context/AtomContextTests.swift index 8069a86c..f5cfc861 100644 --- a/Tests/AtomsTests/Context/AtomContextTests.swift +++ b/Tests/AtomsTests/Context/AtomContextTests.swift @@ -6,7 +6,7 @@ final class AtomContextTests: XCTestCase { @MainActor func testSubscript() { let atom = TestStateAtom(defaultValue: 0) - let context: AtomWatchableContext = AtomTestContext() + let context: any AtomWatchableContext = AtomTestContext() XCTAssertEqual(context.watch(atom), 0) diff --git a/Tests/AtomsTests/Utilities/TestAtom.swift b/Tests/AtomsTests/Utilities/TestAtom.swift index 1647cdbc..f8f6cf47 100644 --- a/Tests/AtomsTests/Utilities/TestAtom.swift +++ b/Tests/AtomsTests/Utilities/TestAtom.swift @@ -63,7 +63,7 @@ struct TestTaskAtom: TaskAtom, @unchecked Sendable { struct TestThrowingTaskAtom: ThrowingTaskAtom, @unchecked Sendable { var effect: TestEffect? - var getResult: () -> Result + var getResult: () -> Result var key: UniqueKey { UniqueKey() diff --git a/Tests/AtomsTests/Utilities/Utilities.swift b/Tests/AtomsTests/Utilities/Utilities.swift index 87430392..aa245fe0 100644 --- a/Tests/AtomsTests/Utilities/Utilities.swift +++ b/Tests/AtomsTests/Utilities/Utilities.swift @@ -34,8 +34,8 @@ final class TestObservableObject: ObservableObject, @unchecked Sendable { } final class AsyncThrowingStreamPipe: @unchecked Sendable { - private(set) var stream: AsyncThrowingStream - private(set) var continuation: AsyncThrowingStream.Continuation + private(set) var stream: AsyncThrowingStream + private(set) var continuation: AsyncThrowingStream.Continuation init() { (stream, continuation) = AsyncThrowingStream.makeStream() @@ -61,7 +61,7 @@ final class ResettableSubject: Publisher, Subject { internalSubject.send(completion: completion) } - func send(subscription: Combine.Subscription) { + func send(subscription: any Combine.Subscription) { internalSubject.send(subscription: subscription) } From f06d3cc9b0f5a4be82db9679de4e045d600ae47c Mon Sep 17 00:00:00 2001 From: ra1028 Date: Tue, 8 Oct 2024 21:14:25 +0900 Subject: [PATCH 2/2] Format --- Examples/Packages/CrossPlatform/Package.swift | 2 +- Examples/Packages/iOS/Package.swift | 2 +- Package.swift | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Examples/Packages/CrossPlatform/Package.swift b/Examples/Packages/CrossPlatform/Package.swift index 2047920c..4dda6308 100644 --- a/Examples/Packages/CrossPlatform/Package.swift +++ b/Examples/Packages/CrossPlatform/Package.swift @@ -4,7 +4,7 @@ import PackageDescription let atoms = Target.Dependency.product(name: "Atoms", package: "swiftui-atom-properties") let swiftSettings: [SwiftSetting] = [ - .enableUpcomingFeature("ExistentialAny"), + .enableUpcomingFeature("ExistentialAny") ] let package = Package( diff --git a/Examples/Packages/iOS/Package.swift b/Examples/Packages/iOS/Package.swift index c5ef56fc..ab48baeb 100644 --- a/Examples/Packages/iOS/Package.swift +++ b/Examples/Packages/iOS/Package.swift @@ -4,7 +4,7 @@ import PackageDescription let atoms = Target.Dependency.product(name: "Atoms", package: "swiftui-atom-properties") let swiftSettings: [SwiftSetting] = [ - .enableUpcomingFeature("ExistentialAny"), + .enableUpcomingFeature("ExistentialAny") ] let package = Package( diff --git a/Package.swift b/Package.swift index b51ee33f..e8c74627 100644 --- a/Package.swift +++ b/Package.swift @@ -3,7 +3,7 @@ import PackageDescription let swiftSettings: [SwiftSetting] = [ - .enableUpcomingFeature("ExistentialAny"), + .enableUpcomingFeature("ExistentialAny") ] let package = Package(