有没有一种方法可以在Swift字符串中替换字符?

587
我正在寻找一种方法来替换Swift中的字符String
例如:"This is my string"
我想将" "替换为"+",以便得到"This+is+my+string"。
我该如何实现?

Swift Extension - Juan Boero
24个回答

1084
这个答案已经更新了Swift 4和5。如果你仍在使用Swift 1、2或3,请查看修订历史记录
你有几个选择。你可以像@jaumard建议的那样使用replacingOccurrences()
let aString = "This is my string"
let newString = aString.replacingOccurrences(of: " ", with: "+", options: .literal, range: nil)

正如@cprcrack所指出的那样,optionsrange参数是可选的,如果您不想指定字符串比较选项或替换范围,您只需要以下内容。

let aString = "This is my string"
let newString = aString.replacingOccurrences(of: " ", with: "+")

或者,如果数据以这种特定格式存在,您只需要替换分隔符,那么您可以使用components()将字符串拆分为数组,然后使用join()函数将它们与指定的分隔符重新组合在一起。
let toArray = aString.components(separatedBy: " ")
let backToString = toArray.joined(separator: "+")

如果您正在寻找一种更加Swifty的解决方案,而不使用NSString的API,您可以使用以下方法。

let aString = "Some search text"

let replaced = String(aString.map {
    $0 == " " ? "+" : $0
})

11
选项(options)和范围(range)参数是可选的。 - cprcrack
1
很棒的Swift2替代方案,用于替换字符串中的特定字符。 - rjb101
我不知道我是否做错了什么,但第二个Swift 2.0解决方案让我得到了一个可选字符串。原始字符串看起来像这样:"x86_64",而新的映射看起来像这样:"Optional(["x", "8", "6", "_", "6", "4"])". - John Shelley
8
对于在 Swift 2 中使用 stringByReplacingOccurrencesOfString 函数有问题的人,你需要 import Foundation 才能使用该方法。 - Liron Yahdav
1
哇,stringByReplacingOccurrencesOfString,多么直观!我原本期望的是类似于在第二个参数中用第一个参数的值替换第一个参数的新字符串。 - Novellizator
显示剩余4条评论

74

您可以使用以下代码:

let s = "This is my string"
let modified = s.replace(" ", withString:"+")    

如果您在代码中的任何地方添加了此扩展方法:

extension String
{
    func replace(target: String, withString: String) -> String
    {
       return self.stringByReplacingOccurrencesOfString(target, withString: withString, options: NSStringCompareOptions.LiteralSearch, range: nil)
    }
}

Swift 3:

extension String
{
    func replace(target: String, withString: String) -> String
    {
        return self.replacingOccurrences(of: target, with: withString, options: NSString.CompareOptions.literal, range: nil)
    }
}

2
我不会将函数命名为“replace”,因为这会暗示它会改变变量。使用与苹果相同的语法。将其称为“replacing(_:withString:)”会使其更加清晰。未来的可变“replace”函数也会在命名上产生冲突。 - Sunkas

69

Swift 3、Swift 4、Swift 5解决方案

let exampleString = "Example string"

//Solution suggested above in Swift 3.0
let stringToArray = exampleString.components(separatedBy: " ")
let stringFromArray = stringToArray.joined(separator: "+")

//Swiftiest solution
let swiftyString = exampleString.replacingOccurrences(of: " ", with: "+")

22

你测试过这个了吗:

var test = "This is my string"

let replaced = test.stringByReplacingOccurrencesOfString(" ", withString: "+", options: nil, range: nil)

18
var str = "This is my string"

print(str.replacingOccurrences(of: " ", with: "+"))

输出为

This+is+my+string

15

Swift 5.5

我正在使用这个扩展:

extension String {

    func replaceCharacters(characters: String, toSeparator: String) -> String {
        let characterSet = CharacterSet(charactersIn: characters)
        let components = components(separatedBy: characterSet)
        let result = components.joined(separator: toSeparator)
        return result
    }

    func wipeCharacters(characters: String) -> String {
        return self.replaceCharacters(characters: characters, toSeparator: "")
    }
}

用法:

"<34353 43434>".replaceCharacters(characters: "< >", toSeparator:"+") // +34353+43434+
"<34353 43434>".wipeCharacters(characters: "< >") // 3435343434

12

Swift 4:

let abc = "Hello world"

let result = abc.replacingOccurrences(of: " ", with: "_", 
    options: NSString.CompareOptions.literal, range:nil)

print(result :\(result))

输出:

result : Hello_world

8
一种类似Sunkas的Swift 3方案:
extension String {
    mutating func replace(_ originalString:String, with newString:String) {
        self = self.replacingOccurrences(of: originalString, with: newString)
    }
}

使用:

var string = "foo!"
string.replace("!", with: "?")
print(string)

输出:

foo?

7

一个修改现有可变字符串的类别:

extension String
{
    mutating func replace(originalString:String, withString newString:String)
    {
        let replacedString = self.stringByReplacingOccurrencesOfString(originalString, withString: newString, options: nil, range: nil)
        self = replacedString
    }
}

使用:

name.replace(" ", withString: "+")

7

基于Ramis的答案,这是一个Swift 3解决方案:

extension String {
    func withReplacedCharacters(_ characters: String, by separator: String) -> String {
        let characterSet = CharacterSet(charactersIn: characters)
        return components(separatedBy: characterSet).joined(separator: separator)
    }
}

尝试根据Swift 3的命名规范提出一个适当的函数名称。

这是我首选的解决方案,因为它可以让您一次替换多个字符。 - Incinerator

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