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
- 支持动态构建
,例如从Kotlinva_列表
()。在这种情况下,很容易使用这种变体:数组
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 */)]