Swift String Range-有没有更简单的方法来定义字符串范围?

时间:2019-10-07 11:31:12

标签: swift string range

我考虑是否有一些更简单的方法来定义字符串范围,我尝试使用一些需要范围和快速范围的函数,这似乎难以理解且冗长。

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) )

2 个答案:

答案 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))