【发布时间】:2021-02-06 05:37:16
【问题描述】:
基于this issue关于使用NSString格式化我尝试在使用vararg时实现格式化的多平台实现,到目前为止没有运气。
我做了什么
- 添加了 FoundationInterop.def
language = Objective-C
---
#import <Foundation/NSString.h>
NSString* format(NSString* format, ...) {
va_list args;
va_start(args, format);
NSString* result = [[NSString alloc] initWithFormat:format arguments:args];
va_end(args);
return result;
}
- 在 gradle 中编译
targets {
final def iOSTarget = System.getenv('SDK_NAME')?.startsWith("iphoneos") \
? presets.iosArm64 : presets.iosX64
// https://kotlinlang.org/docs/reference/mpp-dsl-reference.html#native-targets
fromPreset(iOSTarget, 'ios') {
binaries {
}
compilations.main.cinterops {
FoundationInterop {
}
}
}
}
- 在
commonMain中创建StringExtensions.kt
expect class StringType
expect fun String.format(format: String, vararg args: Any?): StringType?
- 在
iosMain
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
编辑
stringWithFormat 给出相同的结果
actual fun String.format(format: String, vararg args: Any?): StringType? {
return NSString.stringWithFormat(format, args as Any)
}
编辑 2
【问题讨论】:
-
不是您的问题的答案,我想检查它为什么不起作用,但您提供的问题现已关闭:从 1.3.40 开始,可以直接使用
initWithFormat. -
@shadowsheep 感谢您指出这一点,但它也不起作用,请参阅我的编辑
-
@shadowsheep 这个方法在我们传递像
NSString.stringWithFormat("%@ %@ %d", "один" as NSString, "two" as NSString, 3)这样的参数时有效,但不适用于vararg -
知道了。现在更清楚了;)。所以我可以建议“格式化”你的格式和你的可变参数,以便函数相应地工作,在 iOS 内部真正有趣。
-
@shadowsheep 会是什么样子?
标签: objective-c kotlin gradle kotlin-multiplatform kotlin-native