diff --git a/Sources/SkipBridge/AnyDynamicObject.swift b/Sources/SkipBridge/AnyDynamicObject.swift index 27abde3..83021b4 100644 --- a/Sources/SkipBridge/AnyDynamicObject.swift +++ b/Sources/SkipBridge/AnyDynamicObject.swift @@ -40,6 +40,11 @@ open class AnyDynamicObject: JObjectProtocol, JConvertible { } } + /// Cast this instance to a generated `AnyDynamicObject` subclass type. + public func `as`(_ type: T.Type) throws -> T { + return try T(for: object.ptr) + } + public subscript(dynamicMember member: String) -> Bool { get { jniContext { diff --git a/Sources/SkipBridgeToKotlinSamples/Samples.swift b/Sources/SkipBridgeToKotlinSamples/Samples.swift index 99fd525..e8bf9ba 100644 --- a/Sources/SkipBridgeToKotlinSamples/Samples.swift +++ b/Sources/SkipBridgeToKotlinSamples/Samples.swift @@ -132,6 +132,12 @@ public class SwiftClass { } } +extension SwiftClass { + public func swiftExtensionFunc(_ i: Int) -> Int { + return i + } +} + public final class SwiftSubclass: SwiftClass { public var stringVar: String @@ -150,6 +156,10 @@ public final class SwiftHelperClass: SwiftProtocol, Comparable, Identifiable { public init() { } + public init(string: String?) throws { + self.stringVar = string! + } + public func stringValue() -> String { return stringVar } diff --git a/Sources/SkipBridgeToSwiftSamples/Samples.swift b/Sources/SkipBridgeToSwiftSamples/Samples.swift index b3649a3..b8d84e2 100644 --- a/Sources/SkipBridgeToSwiftSamples/Samples.swift +++ b/Sources/SkipBridgeToSwiftSamples/Samples.swift @@ -60,6 +60,9 @@ public var kotlinInnerClassVar = KotlinHelperClass.Inner() public var kotlinSwiftClassVar = SwiftHelperClass() public var kotlinAnyVar: Any = "a" public var kotlinAnyHashableVar: AnyHashable = 1 +#if os(Android) || ROBOLECTRIC +public var kotlinJavaTypeVar: java.util.Date = java.util.Date() +#endif // MARK: Global optional vars @@ -134,6 +137,12 @@ public class KotlinClass { } } +extension KotlinClass { + public func kotlinExtensionFunc(_ i: Int) -> Int { + return i + } +} + public final class KotlinSubclass: KotlinClass { public var stringVar: String diff --git a/Sources/SkipBridgeToSwiftSamplesTestsSupport/TestsSupport.swift b/Sources/SkipBridgeToSwiftSamplesTestsSupport/TestsSupport.swift index d1b3d3a..6e645dd 100644 --- a/Sources/SkipBridgeToSwiftSamplesTestsSupport/TestsSupport.swift +++ b/Sources/SkipBridgeToSwiftSamplesTestsSupport/TestsSupport.swift @@ -5,6 +5,7 @@ // as published by the Free Software Foundation https://fsf.org import Foundation +import SkipBridge import SkipBridgeToSwiftSamples import SkipBridgeToSwiftSamplesHelpers @@ -181,6 +182,27 @@ public func testSupport_kotlinAnyHashableVar_kotlinClass(value: String) -> Strin return (kotlinAnyHashableVar as? KotlinHelperClass)?.stringVar } +public func testSupport_kotlinJavaTypeVar() -> String? { + #if os(Android) || ROBOLECTRIC + guard kotlinJavaTypeVar is AnyDynamicObject else { + return "kotlinJavaTypeVar is AnyDynamicObject" + } + let time: Int64 = kotlinJavaTypeVar.time + guard time > 0 else { + return "time > 0" + } + let date = try! AnyDynamicObject(className: "java.util.Date", 999) + kotlinJavaTypeVar = date + let time2: Int64 = kotlinJavaTypeVar.time + guard time2 == 999 else { + return "time2 == 999" + } + return nil + #else + return nil + #endif +} + public func testSupport_kotlinOptionalBoolVar(value: Bool?) -> Bool? { kotlinOptionalBoolVar = value return kotlinOptionalBoolVar @@ -334,6 +356,11 @@ public func testSupport_kotlinClassComparable(lhs: String, rhs: String) -> Bool return lhsHelper < rhsHelper } +public func testSupport_kotlinExtension(value: Int) -> Int { + let cls = KotlinClass() + return cls.kotlinExtensionFunc(value) +} + public func testSupport_kotlinSubclass() -> String? { let sub = KotlinSubclass(string: "sub") sub.intVar = 100 diff --git a/Tests/SkipBridgeToKotlinSamplesTests/BridgeToKotlinSamplesTests.swift b/Tests/SkipBridgeToKotlinSamplesTests/BridgeToKotlinSamplesTests.swift index 095224d..adda12a 100644 --- a/Tests/SkipBridgeToKotlinSamplesTests/BridgeToKotlinSamplesTests.swift +++ b/Tests/SkipBridgeToKotlinSamplesTests/BridgeToKotlinSamplesTests.swift @@ -280,6 +280,11 @@ final class BridgeToKotlinTests: XCTestCase { XCTAssertFalse(lhs < rhs) } + public func testSwiftExtension() { + let cls = SwiftClass() + XCTAssertEqual(100, cls.swiftExtensionFunc(100)) + } + public func testSwiftSubclass() { let sub = SwiftSubclass(string: "sub") sub.intVar = 100 diff --git a/Tests/SkipBridgeToSwiftSamplesTestsSupportTests/BridgeToSwiftSamplesTests.swift b/Tests/SkipBridgeToSwiftSamplesTestsSupportTests/BridgeToSwiftSamplesTests.swift index 2a6b787..7a5d4eb 100644 --- a/Tests/SkipBridgeToSwiftSamplesTestsSupportTests/BridgeToSwiftSamplesTests.swift +++ b/Tests/SkipBridgeToSwiftSamplesTestsSupportTests/BridgeToSwiftSamplesTests.swift @@ -84,6 +84,10 @@ final class BridgeToSwiftTests: XCTestCase { XCTAssertEqual(testSupport_kotlinAnyHashableVar_kotlinClass(value: "ss"), "ss") } + func testJavaTypeVar() { + XCTAssertNil(testSupport_kotlinJavaTypeVar()) + } + func testAnyVarContainerValues() { let anyArray = testSupport_kotlinAnyVar(value: ["a", 2, 3.0]) as? [Any] guard let anyArray else { @@ -192,7 +196,11 @@ final class BridgeToSwiftTests: XCTestCase { XCTAssertFalse(testSupport_kotlinClassComparable(lhs: "bbb", rhs: "aaa")) } - public func testKotlinSubclass() { + func testKotlinExtension() { + XCTAssertEqual(100, testSupport_kotlinExtension(value: 100)) + } + + func testKotlinSubclass() { XCTAssertNil(testSupport_kotlinSubclass()) }