xiaobailong24
09/09/2021, 12:56 PMabstract class JavaAbsClass
in java library, and a
class ObjcAbsClass
in objc library.
So
except abstract class CommonAbsClass
is defined in kmm commonMain module, and
actual typealias CommonAbsClass = JavaAbsClass
that's not a problem in kmm jvmMain module.
But in kmm iosMain module, not only
actual typealias CommonAbsClass = ObjcAbsClass`
is unsupported, but also
actual typealias CommonAbsClass = ObjcAbsClassWrapper
abstract class ObjcAbsClassWrapper:ObjcAbsClass()
will get a compiler error with Non-final Kotlin subclasses of Objective-C classes are not yet supported
.
So how should I do to interop abstract class with both jvm and objc library? Thanks very much!Big Chungus
09/09/2021, 1:01 PMBig Chungus
09/09/2021, 1:02 PMxiaobailong24
09/09/2021, 1:02 PMBig Chungus
09/09/2021, 1:03 PMBig Chungus
09/09/2021, 1:05 PMexpect
after one of the platform declarations and typealias to it on that platform while using actual wrapper on other platforms.
e.g.:
// commonMain
expect class File {
fun getPath(): String
}
// jvmMain
actual typealias File = java.io.File
// iosMain
actual class File {
actual fun getPath(): String {
TODO("Delegate to some IOS or posix APIs for this")
}
}
xiaobailong24
09/09/2021, 1:06 PMBig Chungus
09/09/2021, 1:07 PM// commonMain
...
expect fun File.veryCustomMethod()
// jvmMain
...
actual fun File.veryCustomMethod() = println("works")
// iosMain
...
actual fun File.veryCustomMethod() = println("works")
Big Chungus
09/09/2021, 1:08 PM...
// iosMain
actual class File: SomeObjCFileClass() {
actual fun getPath(): String {
TODO("Delegate to some IOS or posix APIs for this")
}
}
xiaobailong24
09/09/2021, 1:21 PM//commonMain
except class CommonAnotherClass
except var CommonAnotherClass.file : File
//iosMain
actual typealias CommonAnotherClass = ObjCAnotherClass
actual var CommonAnotherClass.file : File
get() = this.getFile() //type mismatch. Return SomeObjCFileClass type defined in objc library
set(value){
this.setFile(value)
}
Big Chungus
09/09/2021, 1:23 PMxiaobailong24
09/09/2021, 1:38 PMthis
is a ObjCAnotherClass object.Big Chungus
09/09/2021, 1:39 PMthis
is CommonAnotherClass
Big Chungus
09/09/2021, 1:40 PMjava.io.File == File
(since it's typealias), but on ios `ObjCAnotherClass != File`(since File just extends CommonAnotherClass)Big Chungus
09/09/2021, 1:42 PMxiaobailong24
09/09/2021, 1:43 PMthis
is NOT ObjCAnotherClass.
But this.getFile()
returned SomeObjCFileClass defined in objc libraryBig Chungus
09/09/2021, 1:47 PMclass A: B()
, then B() is A()
but A() !is B()
xiaobailong24
09/09/2021, 1:48 PMBig Chungus
09/09/2021, 1:50 PMactual class CommonAnotherClass(delegate: ObjCAnotherClass): ObjCAnotherClass by delegate
actual var CommonAnotherClass.file : File
get() = CommonAnotherClass(this.getFile())
set(value){
this.setFile(value)
}
xiaobailong24
09/09/2021, 1:50 PMactual var CommonAnotherClass.file : File
How to interop with objc SomeObjCFileClass.getFile()
Big Chungus
09/09/2021, 1:50 PMxiaobailong24
09/09/2021, 1:52 PMxiaobailong24
09/09/2021, 1:55 PMxiaobailong24
09/09/2021, 2:03 PMactual class CommonAnotherClass(delegate: ObjCAnotherClass): ObjCAnotherClass by delegate
It seems a workaround for me. I'll try tomorrow. Thanks!xiaobailong24
09/14/2021, 7:20 AMxiaobailong24
09/14/2021, 8:21 AMxiaobailong24
09/14/2021, 1:22 PMxiaobailong24
09/15/2021, 2:55 PM