Kotlin本机iOS字符串格式与vararg [英] Kotlin Native iOS string formatting with vararg

查看:89
本文介绍了Kotlin本机iOS字符串格式与vararg的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

基于此问题,有关使用NSString格式,我尝试在使用vararg时实现用于格式化的多平台实现,到目前为止还没有运气.

Based on this issue about using NSString formatting I try to implement multiplatform implementation for formatting when using vararg, with no luck so far.

我做了

  • 添加了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
        • in 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)
            

            • 输出-如您所见,由于某种原因没有发生值替换
              • output - as you see no values substitutions occured for some reason
              • 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

                已创建的问题 https://youtrack.jetbrains.com/issue/KT-42925

                推荐答案

                我确认您对NSString.stringWithFormat的看法.正如我们在JB官方答复中所读到的那样,该功能缺失 Svyatoslav Scherbina,我们可以在这里关注您的问题: KT-42925

                I confirm what you say about NSString.stringWithFormat. The feature is missing as we read in the JB offical answer from Svyatoslav Scherbina and we could follow the issue from you here: KT-42925

                作为一个可怕的解决方法,我建议使用类似的方法(警告:并不详尽,没有很多索引计数检查...)

                As an awful workaround, I was suggesting something like that (WARNING: not exhaustive, without many index count checks...)

                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
                }
                

                但是请看它是否对您来说是有效的解决方法.

                But look if it could be a valid workaround for you.

                这篇关于Kotlin本机iOS字符串格式与vararg的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆