1

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

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

可以预见的是,这会导致

不能在不可变值上使用变异成员:“s”是一个“让”常量

美好的:

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也不行。

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

4

2 回答 2

4

AString不是CharacterView由 索引的Int,而是由 opaqueString.Index类型索引的。因此,您会想说:

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

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

要替换不同的子范围,您可能需要使用各种索引方法,例如index(after:),index(before:)index(_:offsetBy:)onString以偏移范围的下限和上限的索引(这些方法也只是转发到字符串的字符视图)。本问答中对这些方法进行了很好的总结。

不使用作为索引类型背后Int的原因部分是因为String用 an下标 aInt会产生一种错觉,即索引字符串是一个微不足道的操作——情况并非总是如此,因为字符可以有不同的字节长度,因此可能使索引成为 O(n) 操作。

尽管如果您的目标只是设置s一个包含与先前值相同计数的全零的字符串,您可以只做一个赋值:

func foo(s: inout String) {
    s = String(repeating: "0", count: s.characters.count)
}
于 2017-03-03T13:18:44.080 回答
-1

为此,您需要使用可变字符串。这是用 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

于 2017-03-03T12:26:09.003 回答