Kotlin/Nativeの String.replace のバグを回避する

kyamada,KotlinNative
2023/11/14追記: Kotlin1.9.20で修正されました。

Kotlin/Native の String.replace のバグ

Kotlin/Native(1.8.0) の String.replace メソッドには以下の不具合があります。いずれも、iOS で実行した時に発生するバグです。

この問題を避けるためには、Kotlin/Native の String.replace を使わず、Android/iOS それぞれで文字列置換処理を実装する必要があります。

Android/iOS それぞれで文字列置換処理を実装する

Kotlin/Native の shared モジュールで Interface を作成します

TextReplacer.kt
package com.kyamada.listentonovels.shared.model.text
 
interface TextReplacer {
    fun replace(text: String, oldValue: String, newValue: String, useRegex: Boolean): String
}

Android プロジェクト内で TextReplacerImpl を実装します。

TextReplacerImpl.kt
package com.kyamada.listentonovels.androidApp.model.text
 
import com.kyamada.listentonovels.shared.model.text.TextReplacer
 
class TextReplacerImpl : TextReplacer {
    override fun replace(
        text: String,
        oldValue: String,
        newValue: String,
        useRegex: Boolean
    ): String {
        return if (useRegex) {
            text.replace(oldValue.toRegex(), newValue)
        } else {
            text.replace(oldValue, newValue)
        }
    }
}

iOS プロジェクト内で TextReplacerImpl を実装します。

TextReplacerImpl.swift
import Foundation
import shared
 
class TextReplacerImpl: NSObject {
}
 
extension TextReplacerImpl: TextReplacer {
    func replace(text: String, oldValue: String, newValue: String, useRegex: Bool) -> String {
        if useRegex {
            return text.replacingOccurrences(of: oldValue, with: newValue, options: .regularExpression)
        } else {
            return text.replacingOccurrences(of: oldValue, with: newValue)
        }
    }
}
 

あとは、TextReplacerImpl のインスタンスをアプリ起動時などのタイミングで shared モジュールに渡し、そのインスタンスを使って置換処理を行います。

© 品川アプリ.RSS