我想擦除输入字符串。让我们从这开始:
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
也不起作用。
如何替换参数字符串中的字符?
答案 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.Index
,index(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