我正在尝试删除字符串中间的字符。
这就是我想做的
let index = 4
let str = "abcdefg"
let strRemoved = str.remove(at: index) //Removes only character at pos 4
print(strRemoved) //prints 'abcdfg'
答案 0 :(得分:0)
不能。 String
集合的索引不是Int,但是您可以实现自己的remove(at:)
方法,该方法以Int
作为参数。请注意,要从集合中删除元素,您需要将其声明为变量:
extension StringProtocol where Self: RangeReplaceableCollection {
@discardableResult
mutating func remove(at offset: Int) -> Element? {
guard let index = index(startIndex, offsetBy: offset, limitedBy: endIndex) else { return nil }
return remove(at: index)
}
}
游乐场测试:
let index = 4
var abc = "abcdefg"
if let removedChar = abc.remove(at: index) { // Removes at pos 4
print(removedChar) // prints 'e'
print(abc) // prints 'abcdfg'
}
答案 1 :(得分:0)
让我们看一下如何从String
的中间删除字符,该示例用例是从字符串中删除随机字母直到它为空。
方法1:使用String.remove(at:)
删除字符
在这里,我们使用方法String.remove(at:)
选择要删除的字符。不幸的是,String
没有用Int
编制索引,因此您需要提供一个String.Index
值:
var str = "abcdefg"
while str.count > 0 {
let randomIndex = Int.random(in: 0 ..< str.count)
str.remove(at: str.index(str.startIndex, offsetBy: randomIndex))
print(str)
}
输出:
abdefg bdefg befg bfg bf f
方法2:使用prefix()
和dropFirst()
来构建新的String
或者,您可以使用prefix()
和dropFirst()
选择原始String
的一部分来构建新的String
。这两个方法都返回类型Substring
,因此有必要在串联各部分后调用String()
:
var str = "abcdefg"
while str.count > 0 {
let randomIndex = Int.random(in: 0 ..< str.count)
str = String(str.prefix(randomIndex) + str.dropFirst(randomIndex + 1))
print(str)
}
输出:
abcdeg abcde acde acd cd c
方法3:将str
变成[Character]
如果您要反复添加,删除和更改字符,请考虑将String
变成[Character]
。这更容易使用,因为[Character]
可以用Int
进行索引,并且您可以轻松地将名为[Character]
的{{1}}转换为chars
String
。
String(chars)
输出:
var str = "abcdefg" var chars = Array(str) while chars.count > 0 { let randomIndex = Int.random(in: 0 ..< chars.count) chars.remove(at: randomIndex) print(String(chars)) }