Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c Kotlin本机iOS字符串格式(使用vararg)_Objective C_Kotlin_Gradle_Kotlin Multiplatform_Kotlin Native - Fatal编程技术网

Objective c Kotlin本机iOS字符串格式(使用vararg)

Objective c Kotlin本机iOS字符串格式(使用vararg),objective-c,kotlin,gradle,kotlin-multiplatform,kotlin-native,Objective C,Kotlin,Gradle,Kotlin Multiplatform,Kotlin Native,基于对使用NSString格式化的了解,我尝试在使用vararg时实现格式化的多平台实现,但迄今为止运气不佳 我所做的 添加了FoundationInterop.def 在commonMain 在iosMain中 范例 输出-因为您看到由于某种原因没有发生值替换 编辑 stringWithFormat给出了相同的结果 actual fun String.format(format: String, vararg args: Any?): StringType? { r

基于对使用
NSString
格式化的了解,我尝试在使用
vararg
时实现格式化的多平台实现,但迄今为止运气不佳

我所做的

  • 添加了FoundationInterop.def
  • commonMain
  • iosMain中
  • 范例
  • 输出-因为您看到由于某种原因没有发生值替换
编辑

stringWithFormat
给出了相同的结果

actual fun String.format(format: String, vararg args: Any?): StringType? {
    return NSString.stringWithFormat(format, args as Any)
}
编辑2


已创建问题

我确认您对
NSString.stringWithFormat
的说法。当我们在JB官方答案中阅读时,该功能缺失 Svyatoslav Scherbina和我们可以在这里关注您的问题:

作为一个糟糕的解决方法,我建议这样做(警告:不详尽,没有很多索引计数检查…)

<代码>导入平台。 导入平台 实际类型Alias StringType=字符串 实际有趣的字符串。格式(格式: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(正则表达式) for(在args.count()之前的0中的i){ val arg=args[i] returnString+=when(arg){ 是双->{ NSString.stringWithFormat(新闻字符串[i]+单格式[i],参数[i]为双精度) } 是Int->{ NSString.stringWithFormat(新闻字符串[i]+singleFormats[i],参数[i]为Int) } 其他->{ NSString.stringWithFormat(新闻字符串[i]+“%@”,参数[i]) } } } 返回字符串 } 但是,看看这对你来说是否是一个有效的解决办法


不能将Kotlin变量参数转发给C或Objective-C。C变量是编译时变量。 这不是Kotlin的特定限制。不能通过转发所有参数从另一个变量C函数调用变量C函数

NSString.stringWithFormat(格式,参数为任意值)

这是不对的。 此行接受
args
(这是一个
数组
),将其强制转换为
任意
,并作为单个参数传递

所以这大致相当于

[NSString stringWithFormat:format, createKotlinArray(/* all arguments here */)]
这并不是你所期望的

所以这是无效的。 您的问题可能通过缺少的功能之一得到解决:

  • stdlib()中的公共
    String.format
    。但这并不容易
  • 支持动态构建
    va_列表
    ,例如从Kotlin
    数组
    ()。在这种情况下,很容易使用这种变体:

我不想回答您的问题,但您提供的问题现在已经解决:从1.3.40开始,可以直接使用
initWithFormat
。@shadowsheep感谢您指出这一点,但它也不起作用,看我的edit@shadowsheep当我们传递参数如
NSString.stringWithFormat(“%@%@%d”,“Бааа”作为NSString,“2”作为NSString,3)
时,此方法有效,但不使用
vararg
获得它。现在更清楚了;)。因此,我可以建议“格式化”您的格式,并使用vararg,以便函数在iOS中相应地工作。@shadowsheep它看起来如何?感谢您的回答,这是一个有趣的解决方法,我将等待一段时间,也许会有其他解决方案,如果没有,我将删除您的答案,我们应该在Kotlin Native中重新发明轮子来做这些基本的事情,这是一种痛苦。顺便说一句,也许你知道一些KN库已经有了多平台字符串格式选项?这是玩尖端技术的费用。认为我们处于阿尔法阶段,只有五件事情处于贝塔阶段。我不知道是否已经有KN LIB处理字符串格式,但您可以开始搜索和修改。你也可以加入kotlin slack频道,在多平台会议室提问。这里我们有官方答案,也许你会感兴趣的,是的!我见过。这也是我们发现的。该功能缺失,我们采取了变通办法。W8ing用于添加此功能;)。顺便说一句,我已经对你的答案投了赞成票。如果你想改变被接受的答案,请随意这样做。
expect class StringType

expect fun String.format(format: String, vararg args: Any?): StringType?
actual typealias StringType = String

/**
 * https://github.com/JetBrains/kotlin-native/issues/1834
 */
actual fun String.format(format: String, vararg args: Any?): StringType? {
    return FoundationInterop.format(format, args as Any)
}
val fmt = "http://geomag.bgs.ac.uk/web_service/GMModels/igrf/13/?latitude=%f&longitude=%f&altitude=0&date=%d-%02d-%02d&format=json"
val url = fmt.format(urlFmt, 59.127934932762166, 38.00503518930868, 2020, 1, 3)
http://geomag.bgs.ac.uk/web_service/GMModels/igrf/13/?latitude=0.000000&longitude=0.000000&altitude=0&date=43344272-198763328-00&format=json
actual fun String.format(format: String, vararg args: Any?): StringType? {
    return NSString.stringWithFormat(format, args as Any)
}
[NSString stringWithFormat:format, createKotlinArray(/* all arguments here */)]