From ff159937bff5f142130ea840521d9935ffe96b89 Mon Sep 17 00:00:00 2001 From: David Roman <2538074+davdroman@users.noreply.github.com> Date: Fri, 19 Jul 2024 20:05:29 +0100 Subject: [PATCH 1/4] WIP --- Package@swift-6.0.swift | 83 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 Package@swift-6.0.swift diff --git a/Package@swift-6.0.swift b/Package@swift-6.0.swift new file mode 100644 index 0000000..12f0e8e --- /dev/null +++ b/Package@swift-6.0.swift @@ -0,0 +1,83 @@ +// swift-tools-version: 6.0 + +import PackageDescription + +let package = Package( + name: "swiftui-navigation-transitions", + platforms: [ + .iOS(.v13), + .macCatalyst(.v13), + .tvOS(.v13), + ], + swiftLanguageVersions: [.v6] +) + +// MARK: Dependencies + +package.dependencies = [ + .package(url: "https://github.com/siteline/swiftui-introspect", from: "1.0.0"), + .package(url: "https://github.com/pointfreeco/swift-custom-dump", from: "1.0.0"), // dev + .package(url: "https://github.com/pointfreeco/xctest-dynamic-overlay", from: "1.0.0"), // dev +] + +let SwiftUIIntrospect: Target.Dependency = .product( + name: "SwiftUIIntrospect", + package: "swiftui-introspect" +) + +let CustomDump: Target.Dependency = .product( + name: "CustomDump", + package: "swift-custom-dump" +) + +let XCTestDynamicOverlay: Target.Dependency = .product( + name: "XCTestDynamicOverlay", + package: "xctest-dynamic-overlay" +) + +// MARK: Targets + +package.targets += [ + .target(name: "Animation"), + + .target(name: "Animator"), + .testTarget(name: "AnimatorTests", dependencies: [ + "Animator", + "TestUtils", + ]), + + .target(name: "AtomicTransition", dependencies: [ + "Animator", + ]), + .testTarget(name: "AtomicTransitionTests", dependencies: [ + "AtomicTransition", + "TestUtils", + ]), + + .target(name: "NavigationTransition", dependencies: [ + "Animation", + "AtomicTransition", + ]), + + .target(name: "NavigationTransitions", dependencies: [ + "NavigationTransition", + "RuntimeAssociation", + "RuntimeSwizzling", + SwiftUIIntrospect, + ]), + + .target(name: "RuntimeAssociation"), + .target(name: "RuntimeSwizzling"), + + .target(name: "TestUtils", dependencies: [ + CustomDump, + "NavigationTransitions", + XCTestDynamicOverlay, + ]), +] + +// MARK: Product + +package.products += [ + .library(name: "NavigationTransitions", targets: ["NavigationTransitions"]), +] From 2fb3e332cd99a28b62ec6e69b1aead1098b9fd7b Mon Sep 17 00:00:00 2001 From: David Roman <2538074+davdroman@users.noreply.github.com> Date: Fri, 19 Jul 2024 20:05:40 +0100 Subject: [PATCH 2/4] WIP --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b604743..5e5fab4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,6 +28,7 @@ jobs: swift: - "5.9" - "5.10" + - "6.0" steps: - name: Git Checkout uses: actions/checkout@v4 From 5da8244481aa4031a6a3707db483711477915f67 Mon Sep 17 00:00:00 2001 From: David Roman <2538074+davdroman@users.noreply.github.com> Date: Fri, 19 Jul 2024 21:04:14 +0100 Subject: [PATCH 3/4] WIP --- Sources/Animation/Animation.swift | 1 + Sources/Animation/Linear.swift | 1 + Sources/Animator/Animator.swift | 1 + Sources/Animator/AnimatorTransientView.swift | 1 + Sources/Animator/AnimatorTransientViewProperties.swift | 1 + Sources/Animator/Transform.swift | 1 + Sources/RuntimeSwizzling/Swizzle.swift | 3 +++ 7 files changed, 9 insertions(+) diff --git a/Sources/Animation/Animation.swift b/Sources/Animation/Animation.swift index c81e0f5..a43c9ef 100644 --- a/Sources/Animation/Animation.swift +++ b/Sources/Animation/Animation.swift @@ -1,5 +1,6 @@ import UIKit +@MainActor public struct Animation { static var defaultDuration: Double { 0.35 } diff --git a/Sources/Animation/Linear.swift b/Sources/Animation/Linear.swift index ec5787f..c2110ab 100644 --- a/Sources/Animation/Linear.swift +++ b/Sources/Animation/Linear.swift @@ -1,3 +1,4 @@ +@MainActor extension Animation { public static func linear(duration: Double) -> Self { .init(duration: duration, curve: .linear) diff --git a/Sources/Animator/Animator.swift b/Sources/Animator/Animator.swift index c0508c8..c0250be 100644 --- a/Sources/Animator/Animator.swift +++ b/Sources/Animator/Animator.swift @@ -38,6 +38,7 @@ public typealias _Animator = Animator func addCompletion(_ completion: @escaping (UIViewAnimatingPosition) -> Void) } +@MainActor extension Animator where Self: UIViewImplicitlyAnimating { public func addAnimations(_ animation: @escaping () -> Void) { addAnimations?(animation) diff --git a/Sources/Animator/AnimatorTransientView.swift b/Sources/Animator/AnimatorTransientView.swift index 48b7672..31f0414 100644 --- a/Sources/Animator/AnimatorTransientView.swift +++ b/Sources/Animator/AnimatorTransientView.swift @@ -9,6 +9,7 @@ import UIKit /// view being animated, which helps compound mutating values across /// different defined transitions before actually submitting them /// to the animator. This helps ensure no jumpy behavior in animations occurs. +@MainActor @dynamicMemberLookup public class AnimatorTransientView { /// Typealias for `AnimatorTransientViewProperties`. diff --git a/Sources/Animator/AnimatorTransientViewProperties.swift b/Sources/Animator/AnimatorTransientViewProperties.swift index 5775105..6e30b1a 100644 --- a/Sources/Animator/AnimatorTransientViewProperties.swift +++ b/Sources/Animator/AnimatorTransientViewProperties.swift @@ -15,6 +15,7 @@ public struct AnimatorTransientViewProperties: Equatable { public var zPosition: CGFloat } +@MainActor extension AnimatorTransientViewProperties { static let `default` = Self( alpha: 1, diff --git a/Sources/Animator/Transform.swift b/Sources/Animator/Transform.swift index 3c7e980..b307e58 100644 --- a/Sources/Animator/Transform.swift +++ b/Sources/Animator/Transform.swift @@ -14,6 +14,7 @@ public struct Transform: Equatable { } } +@MainActor extension OptionalWithDefault where Value == Transform { func assign(to uiView: UIView, force: Bool) { self.assign(force: force) { diff --git a/Sources/RuntimeSwizzling/Swizzle.swift b/Sources/RuntimeSwizzling/Swizzle.swift index baf3808..68578be 100644 --- a/Sources/RuntimeSwizzling/Swizzle.swift +++ b/Sources/RuntimeSwizzling/Swizzle.swift @@ -1,7 +1,9 @@ import ObjectiveC +@MainActor public var swizzleLogs = false +@MainActor public func swizzle(_ type: AnyObject.Type, _ original: Selector, _ swizzled: Selector) { guard !swizzlingHistory.contains(type, original, swizzled) else { return @@ -46,4 +48,5 @@ private struct SwizzlingHistory { } } +@MainActor private var swizzlingHistory = SwizzlingHistory() From e850123fd6ac786a81e03fcccb18f55985220308 Mon Sep 17 00:00:00 2001 From: David Roman <2538074+davdroman@users.noreply.github.com> Date: Fri, 19 Jul 2024 21:08:56 +0100 Subject: [PATCH 4/4] WIP --- Sources/RuntimeSwizzling/Swizzle.swift | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Sources/RuntimeSwizzling/Swizzle.swift b/Sources/RuntimeSwizzling/Swizzle.swift index 68578be..2773e56 100644 --- a/Sources/RuntimeSwizzling/Swizzle.swift +++ b/Sources/RuntimeSwizzling/Swizzle.swift @@ -1,7 +1,6 @@ import ObjectiveC -@MainActor -public var swizzleLogs = false +nonisolated(unsafe) public var swizzleLogs = false @MainActor public func swizzle(_ type: AnyObject.Type, _ original: Selector, _ swizzled: Selector) { @@ -48,5 +47,4 @@ private struct SwizzlingHistory { } } -@MainActor -private var swizzlingHistory = SwizzlingHistory() +nonisolated(unsafe) private var swizzlingHistory = SwizzlingHistory()