gpt4 book ai didi

ios - 如何将 vararg 参数从 Kotlin 通用代码传递给 iOS 函数?

转载 作者:行者123 更新时间:2023-12-04 04:08:37 28 4
gpt4 key购买 nike

我有一个 Kotlin 多平台项目,有两个目标:Android 和 iOS。我试图在我的公共(public)代码中公开一个类似 JVM 的 String.format 函数

expect fun format(format: String, vararg params: Any?)

在Android端,我可以简单地使用

actual fun format(format: String, vararg params: Any?) {
return if(params.isEmpty()) {
format
} else {
java.lang.String.format(Locale.getDefault(), format, *params)
}
}

然而,在iOS端,使用等效的方法

actual fun format(format: String, vararg params: Any?) {
return if(params.isEmpty()) {
format
} else {
NSString.stringWithFormat(format, *params)
}
}

导致编译错误:

When calling variadic Objective-C methods spread operator is supported only for *arrayOf(...)

我找到并阅读了 this issue在 Kotlin/Native Github 上,但这似乎只能解决带有显式参数的调用。

那么如何将可变参数传递给 Objective-C 函数呢?还是真的不可能?似乎我遗漏了一些明显的东西。

最佳答案

来 self 的回答here .

我们在 JB 的官方回答中读到该功能缺失Svyatoslav Scherbina,我们可以在这里关注这个问题:KT-42925

作为一个糟糕的解决方法,我提出了类似的建议(警告:不详尽,没有很多索引计数检查......)

import platform.Foundation.NSString
import platform.Foundation.stringWithFormat

actual typealias StringType = String

actual fun String.format(format: String, vararg args: Any?): StringType? {
var returnString = ""
val regEx = "%[\\d|.]*[sdf]|[%]".toRegex()
val singleFormats = regEx.findAll(format).map {
it.groupValues.first()
}.asSequence().toList()
val newStrings = format.split(regEx)
for (i in 0 until args.count()) {
val arg = args[i]
returnString += when (arg) {
is Double -> {
NSString.stringWithFormat(newStrings[i] + singleFormats[i], args[i] as Double)
}
is Int -> {
NSString.stringWithFormat(newStrings[i] + singleFormats[i], args[i] as Int)
}
else -> {
NSString.stringWithFormat(newStrings[i] + "%@", args[i])
}
}
}

return returnString
}

但看看它是否对您来说是一个有效的解决方法。

enter image description here

关于ios - 如何将 vararg 参数从 Kotlin 通用代码传递给 iOS 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62113545/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com