Swift字符串替换出现次数

4
我想使用Swift将一些字符替换为英文字母。替换代码如下:
let turkish = ["ı", "ğ", "ü", "ş", "ö", "ç"]
let english = ["i", "g", "u", "s", "o", "c"]

var city = "Ağri"
var result = ""

for i in 0..<turkish.count {
    var target = turkish[i]
    var destination = english[i]

    result = city.stringByReplacingOccurrencesOfString(target, withString: destination, options: NSStringCompareOptions.CaseInsensitiveSearch | NSStringCompareOptions.LiteralSearch, range: nil)
}

它不会用"g"替换"ğ"。奇怪的是,如果我直接像这样输入:
result = city.stringByReplacingOccurrencesOfString("ğ", withString: "g", options: NSStringCompareOptions.CaseInsensitiveSearch | NSStringCompareOptions.LiteralSearch, range: nil)

它完全正常运行。

但当我第一次将值赋给一个 String 变量时,为什么它就不工作了呢?

2个回答

12

看起来您正在尝试去除各种重音符号和变音符号。您可以使用 CFStringTransform 来实现这一目标。

在 Swift 中,它可能会像这样:

let original = "šÜįéïöç"
var mutableString = NSMutableString(string: original) as CFMutableStringRef
CFStringTransform(mutableString, nil, kCFStringTransformStripCombiningMarks, Boolean(0))

let normalized = (mutableString as NSMutableString).copy() as! NSString
// = sUieioc

编辑

正如Martin R在评论中指出的那样,你可以不使用核心基础框架也做到同样的事情:

let original = "šÜįéïöç"
let normalized = original.stringByFoldingWithOptions(.DiacriticInsensitiveSearch, locale: NSLocale.currentLocale())
// = sUieioc

4
可以直接在Swift字符串上完成相同的操作,而无需使用CoreFoundation:https://dev59.com/questions/jl0b5IYBdhLWcg3wLOg2(我从http://stackoverflow.com/a/15155624/1187415学到的)。 - Martin R
@MartinR 有趣。我不知道那个。 - David Rönnqvist
谢谢。这是一个比迭代和替换字符更好的解决方案。 - aymeba
1
备注: 这不会将 "ı"(无点小写拉丁字母 I)替换为 "i"。 - Martin R

2
这是因为您替换城市的出现次数,但将新值赋给了结果。这种方式只会在结果中替换最后一个字符。 只需删除结果变量并更改此行即可:
result = city.stringByReplacingOccurrencesOfString(target, withString: destination, options: NSStringCompareOptions.CaseInsensitiveSearch | NSStringCompareOptions.LiteralSearch, range: nil)

转换为:

city = city.stringByReplacingOccurrencesOfString(target, withString: destination, options: NSStringCompareOptions.CaseInsensitiveSearch | NSStringCompareOptions.LiteralSearch, range: nil)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接