所以我試圖為 Swift 上的字串類創建一個替換函式,以符合它在 Python 上的作業方式(要替換的字串,要替換的字串,要替換的計數),我發現 @rmaddy 的這個擴展確實那個,但是當我將它添加到我的 XCode 專案時,我得到了錯誤:
在“Range”上參考初始化程式“init(_:)”要求“String.Index”符合“Strideable”
//Developed by rmaddy @ https://stackoverflow.com/users/2303865/rmaddy
extension String {
func replacingOccurrences<Target, Replacement>(of target: Target, with replacement: Replacement, count: Int, options: String.CompareOptions = [], range searchRange: Range<String.Index>? = nil) -> String where Target : StringProtocol, Replacement : StringProtocol {
var matches = [Range<String.Index>]()
//This is where I get the error
var sRange = searchRange ?? Range(startIndex..<endIndex)
while matches.count < count && !sRange.isEmpty {
if let mRange = range(of: target, options: options, range: sRange, locale: nil) {
matches.append(mRange)
if options.contains(.backwards) {
sRange = Range(sRange.lowerBound..<mRange.lowerBound)
} else {
sRange = Range(mRange.upperBound..<sRange.upperBound)
}
} else {
break
}
}
var res = self
for range in matches.sorted(by: { $0.lowerBound > $1.lowerBound }) {
res.replaceSubrange(range, with: replacement)
}
return res
}
}
我試過瀏覽 Swift 檔案,但找不到解決方法,請幫忙。
需要明確的是,我想替換文本檔案中出現的多個單詞(作為腳本讀取),但不是全部。我沒有使用查找和替換功能,因為我希望它是動態的并且能夠根據演算法選擇替換詞。基本上我正在做一個改變“說”與“驚呼”和其他同義詞出現的東西。該專案是一個用于長文本檔案的釋義引擎,它在 Python 上運行起來很容易,但在 Swift 上重寫它被證明是非常具有挑戰性的。
謝謝你的時間,人們。
uj5u.com熱心網友回復:
您可以使用此擴展程式改進其他一些要點。您應該擴展 StringProtocol 而不是 String 以使其通用并允許您將其與 Substrings 一起使用。另一個重要的變化是回傳 Self 而不是 String。請注意,在擴展 StringProtocol 時,您需要約束 Self 以RangeReplaceableCollection
允許您使用replaceSubrange
方法。我還將語言環境添加到您的方法簽名和一些語法改進中:
extension StringProtocol where Self: RangeReplaceableCollection {
func replacingOccurrences<Target: StringProtocol, Replacement: StringProtocol>(
of target: Target,
with replacement: Replacement,
count: Int,
options: String.CompareOptions = [],
range searchRange: Range<Index>? = nil,
locale: Locale? = nil
) -> Self {
var ranges: [Range<Index>] = []
var searchRange = searchRange ?? startIndex..<endIndex
while ranges.count < count && !searchRange.isEmpty {
if let range = self.range(
of: target,
options: options,
range: searchRange,
locale: locale
) {
ranges.append(range)
searchRange = options.contains(.backwards) ?
searchRange.lowerBound..<range.lowerBound :
range.upperBound..<searchRange.upperBound
} else {
break
}
}
var collection = self
for range in ranges.sorted(using: KeyPathComparator(\.lowerBound, order: .reverse)) {
collection.replaceSubrange(range, with: replacement)
}
return collection
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/506894.html