在KotlinMultiplatform移动的中使用Collator对列表进行排序

qvsjd97n  于 2023-02-16  发布在  Kotlin
关注(0)|答案(1)|浏览(112)

假设我有一个带有波兰语发音符号的名字列表:

listOf("Zosia", "Łucja", "Asia")

我想排序它,并获得如下结果:

[Asia, Łucja, Zosia]

我可以在Kotlin中使用Collator执行它,如下所示:

listOf.sortedWith { s1, s2 ->
        Collator.getInstance(Locale("pl", "PL")).compare(s1, s2)
    }

不幸的是,我无法在commonMain模块中使用上面的代码,因为CollatorLocale类在那里无法访问,所以我决定创建期望/实际函数,但我不知道如何在iOS版本中实现它。
在斯威夫特,我可以这样写道:

listOf.sorted { $0.localizedCompare($1) == .orderedAscending }

但这对iosMain模块中的Kotlin实现没有帮助。
那么,如何在KMM中使用iOS的Collator对列表进行排序呢?

zf9nrax1

zf9nrax11#

在你的iosMain中你可以使用localizedCompare,它是NSString类的方法,你只需要从platform.Foundation导入它

import platform.Foundation.NSString
import platform.Foundation.localizedCompare

fun List<String>.sortedLocaleAware(): List<String> {
    return sortedWith { s1, s2 ->
        (s1 as NSString).localizedCompare(s2).toInt()
    }
}

你会收到编译器警告,因为强制转换到NSString时,它会告诉你这个强制转换永远不会成功。但是没关系,这是Kotlin文档中推荐的方法。
您可以使用@Suppress("CAST_NEVER_SUCCEEDS")抑制它

相关问题