我考虑是否有一些更简单的方法来定义字符串范围,我尝试使用一些需要范围和快速范围的函数,这似乎难以理解且冗长。
title.startIndex..<title.index(title.startIndex, offsetBy: 1)
只能说我只想搜索此字符串的[0,1)个字符
label.text = title.replacingOccurrences(of: "\n", with: "", options: .caseInsensitive, range: title.startIndex..<title.index(title.startIndex, offsetBy: 1) )
答案 0 :(得分:0)
实际上没有一种简洁的方法来指定String
范围。
您可以通过扩展使其更好一点:
extension StringProtocol {
func range(_ ir: Range<Int>) -> Range<String.Index> {
return self.index(self.startIndex, offsetBy: ir.lowerBound) ..< self.index(self.startIndex, offsetBy: ir.upperBound)
}
}
然后
title.startIndex..<title.index(title.startIndex, offsetBy: 1)
成为
title.range(0..<1)
注意:请小心指定有效范围,否则将崩溃,就像在示例中使用超出字符串末尾的偏移量一样。
答案 1 :(得分:0)
问题在于replacingOccurrencesOf
是可可Objective-C NSString方法,因此您最终会遇到Range的String概念与NSRange的NSString概念之间的类型阻抗不匹配的情况。最简单的解决方案是留在NSString世界中:
label.text = (title as NSString).replacingOccurrences(
of: "\n", with: "", options: .caseInsensitive,
range: NSRange(location: 0, length: 2))
否则,我同意vacawama的扩展想法:
extension String {
func range(_ start:Int, _ count:Int) -> Range<String.Index> {
let i = self.index(start >= 0 ?
self.startIndex :
self.endIndex, offsetBy: start)
let j = self.index(i, offsetBy: count)
return i..<j
}
func nsRange(_ start:Int, _ count:Int) -> NSRange {
return NSRange(self.range(start,count), in:self)
}
}
那你可以说
label.text = title.replacingOccurrences(
of: "\n", with: "", options: .caseInsensitive,
range: title.range(0,2))