如何在Kotlin Multiplatform和Swift中使用默认接口实现

问题描述

我正在使用KMP在Android和iOS上制作一个跨平台应用程序。我的问题是,当我在Kotlin公共主界面中使用认实现创建接口时,无法在iOS中使用该实现,而需要在Xcode中重写代码。在我的方法中,没有什么特定于平台的。它们只是与数字一起使用的函数(因此,仅一些for或如果有返回数字参数),对我来说可能很好,只需编写一次方法。有办法做到这一点吗?

这是Kotlin中带有方法认实现的接口:

interface StandardValues {
fun nextValue(valuetoCompare: String,currentStandardSpinner: String,currentUnitSpinner: Int): Pair<String,Int> {

    var currentStandardArray = StandardValue.E12.valuesstandard
    var indexSpinner = currentUnitSpinner
    var valueConverted = 0.0f

    try{
        valueConverted = valuetoCompare.toFloat()
    } catch (e: NumberFormatException){
        e.printstacktrace()
        println(e)
    }

    if(valuetoCompare.isNotEmpty()){
        var prevIoUsValue: Float = 0.0f

        if(valueConverted <= 1 && currentUnitSpinner == 0){
            return Pair("0",0)
        }
        if(valueConverted < 1) {
            for ((index,value) in currentStandardArray.withIndex()){
                if ((valueConverted * 1000) > value){
                    prevIoUsValue = currentStandardArray[index]
                }
            }
            if(indexSpinner != 0){
                indexSpinner--
            }
            return Pair(prevIoUsValue.toString(),indexSpinner)
        }
        if(valueConverted <= currentStandardArray.first()){
            if(indexSpinner == 0){
                return Pair(currentStandardArray.first().toString(),0)
            }
            prevIoUsValue = currentStandardArray.last()
            indexSpinner--
            return Pair(prevIoUsValue.toString(),indexSpinner)
        }
        for ((index,value) in currentStandardArray.withIndex()){
            if (valueConverted > value){
                prevIoUsValue = currentStandardArray[index]
            }
        }
        return Pair(prevIoUsValue.toString(),indexSpinner)
    }
    return Pair(currentStandardArray.first().toString(),indexSpinner)
}

这是在Android中使用的示例:

class FindRealComponent: AppCompatActivity(),AdapterView.OnItemSelectedListener,StandardValues {
...
myTextView.text = nextValue("3","pF",0).first
}

在Xcode中:

class MeasureConverterViewController: UIViewController,StandardValues {
    
    func nextValue(valuetoCompare: String,currentUnitSpinner: Int) -> (String,Int) { 
        //I would like to avoid to write the same logic code

   }
textView.text = nextValue(nextValue("3",0).0
...
}

否则,我认为我将在Kotlin中实现该接口,并在Swift中创建一个带有扩展名的协议。

谢谢。

解决方法

要解决这个问题,我已经在Android Studio中实现了该接口,并且在同一文件中创建了一个实现我的接口的类,因此在Xcode中,我可以实例化该类的对象以使用默认方法。

Android Studio:

interface StandardValues { 
... //default methods 
} 

class StandardValuesImplementation: StandardValues{} 

Xcode:

class MyViewController: UIViewController{ 
... 
override func viewDidLoad() { 
super.viewDidLoad() 
... 
let myClassImpl = StandardValuesImplementation() 
let textView = MyClassImpl.myDefaultMethod 
...
}