diff --git a/Package.swift b/Package.swift index 7335123..96b1b04 100644 --- a/Package.swift +++ b/Package.swift @@ -1,9 +1,9 @@ -// swift-tools-version: 5.9 +// swift-tools-version: 5.10 import PackageDescription let package = Package( name: "skip-bridge", - platforms: [.iOS(.v16), .macOS(.v13)], + platforms: [.iOS(.v16), .macOS(.v14)], products: [ .library(name: "SkipBridge", type: .dynamic, targets: ["SkipBridge"]), .library(name: "SkipBridgeToKotlinSamples", type: .dynamic, targets: ["SkipBridgeToKotlinSamples"]), diff --git a/Sources/SkipBridgeToKotlinCompatSamples/Samples.swift b/Sources/SkipBridgeToKotlinCompatSamples/Samples.swift index 204454b..395707a 100644 --- a/Sources/SkipBridgeToKotlinCompatSamples/Samples.swift +++ b/Sources/SkipBridgeToKotlinCompatSamples/Samples.swift @@ -33,3 +33,67 @@ public class Compat { public struct CompatError: Error { } + +public struct CompatCallbacks: @unchecked Sendable { + // TODO: https://github.com/skiptools/skip/issues/534 + //public typealias AsyncCallback = () async -> () + public typealias AsyncCallback = () -> () + public typealias Callback = () -> () + public typealias URLCallback = (URL) -> () + + // `- error: invalid conversion from 'async' function of type '() async -> ()' to synchronous function type '() throws -> ()' + public let didLogin: AsyncCallback + public let didCancel: AsyncCallback + public let didSelectEmail: Callback + public let didSelectSettings: Callback + public let onURLSelected: URLCallback + + public init( + didLogin: @escaping AsyncCallback = {}, + didCancel: @escaping AsyncCallback = {}, + didSelectEmail: @escaping Callback = {}, + didSelectSettings: @escaping Callback = {}, + onURLSelected: @escaping URLCallback = { _ in } + ) { + self.didLogin = didLogin + self.didCancel = didCancel + self.didSelectEmail = didSelectEmail + self.didSelectSettings = didSelectSettings + self.onURLSelected = onURLSelected + } +} + +@MainActor +open class CompatMainActor: Identifiable { + public nonisolated let id: String + public let scene: Int + + public init(scene: Int, id: String? = nil) { + self.id = id ?? "" + self.scene = scene + setup() + } + + public func setup() { + } +} + +public struct CompatMutableStruct { + public var str: String + public init(_ str: String) { + self.str = str + } + + public mutating func mutableFunc(_ str: String) { + self.str = str + } +} + +//public enum CompatMutableEnum { +// case a +// case b(String) +// +// public mutating func mutableFunc(_ update: String) { +// self = .b(update) +// } +//} diff --git a/Tests/SkipBridgeToKotlinCompatSamplesTests/BridgeToKotlinCompatSamplesTests.swift b/Tests/SkipBridgeToKotlinCompatSamplesTests/BridgeToKotlinCompatSamplesTests.swift index 731a894..fda5902 100644 --- a/Tests/SkipBridgeToKotlinCompatSamplesTests/BridgeToKotlinCompatSamplesTests.swift +++ b/Tests/SkipBridgeToKotlinCompatSamplesTests/BridgeToKotlinCompatSamplesTests.swift @@ -92,4 +92,27 @@ final class BridgeToKotlinCompatTests: XCTestCase { XCTAssertEqual(collected2, listOf(100, 200)) #endif } + + func testCompatCallbacks() async { + #if SKIP + // TODO: make functions async to reproduce https://github.com/skiptools/skip/issues/534 + let callbacks = CompatCallbacks(didLogin: { }, didCancel: { }, didSelectEmail: { }, didSelectSettings: { }, onURLSelected: { url in }) + callbacks.didSelectEmail() + await callbacks.didLogin() + #endif + } + + func testCompatMainActor() async { + #if SKIP + let compatMain = await CompatMainActor(scene: 123) + await compatMain.setup() + #endif + } + + func testCompatMutableStruct() async { + #if SKIP + var compatStruct = CompatMutableStruct("ABC") + compatStruct.mutableFunc("XYZ") + #endif + } }