替换参数字符串中的字符

时间:2017-03-03 11:21:23

标签: swift string string-length inout

我想擦除输入字符串。让我们从这开始:

func foo(s: String) {
    s.replaceSubrange(0..<s.characters.count,
            with: String(repeating: "0", count: s.characters.count))
}

可以预见,这会导致

  

不能在不可变值上使用变异成员:'s'是'let'常量

精细:

func foo(s: inout String) {
    s.replaceSubrange(0..<s.characters.count,
            with: String(repeating: "0", count: s.characters.count))
}

但现在:

  

'inout String'不能转换为'String'

指向.character - 什么?!

奇怪的是,当我这样做时:

func foo(s: inout String) {
    let n = s.characters.count
    s.replaceSubrange(0..<n,
            with: String(repeating: "0", count: n))

}

.characters的调用完全正常,但

  

无法使用类型为'(CountableRange,with:String)'的参数列表调用'replaceSubrange'

使用0...n-1也不起作用。

如何替换参数字符串中的字符?

2 个答案:

答案 0 :(得分:3)

String的{​​{3}}未被Int编入索引,而是由不透明的CharacterView类型编入索引。因此,你想说:

func foo(s: inout String) {
    s.replaceSubrange(s.startIndex..<s.endIndex,
                      with: String(repeating: "0", count: s.characters.count))
}

我们不是直接使用字符串的characters属性来获取开始或结束索引,因为String为了方便而在它的API中为它们提供了 - 但它们是只是转发到CharacterView

要替换不同的子范围,您可能希望在String上使用各种索引方法,例如String.Indexindex(after:)index(before:),以便为范围的下限和上限(这些方法也只是前进到字符串的字符视图)。 index(_:offsetBy:)中给出了这些方法的一个很好的总结。

不使用Int作为索引类型的原因部分是由于使用String下标Int会产生错误,即索引字符串是一项微不足道的操作 - 并非总是如此,因为字符可以具有不同的字节长度,因此可能使索引成为O(n)操作。

虽然如果您的目的只是将s设置为包含与之前值相同的所有零的字符串,您可以改为执行分配:

func foo(s: inout String) {
    s = String(repeating: "0", count: s.characters.count)
}

答案 1 :(得分:-1)

您需要为此目的使用Mutable Strings。这是用Swift 3.0编写的完整代码

var string: NSMutableString = "This is my string."

    func foo(s: NSMutableString)
    {
        s.replaceCharacters(in: NSRange(location:0, length: s.length - 1 ), with: String(repeating: "0", count: s.length))
        print(s)
    }

    foo(s: string) //Function Calling

输出: 000000000000000000