Swift String Range - Есть ли более простой способ определения диапазонов строк? - PullRequest
0 голосов
/ 07 октября 2019

Я считаю, что если есть более простые способы определения диапазонов строк, я попытался использовать некоторую функцию, для которой нужны диапазоны и диапазоны быстрого перехода, кажется невероятно нечитаемым и длинным.

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 голосов
/ 07 октября 2019

Проблема в том, что replacingOccurrencesOf - это метод NSString Какао Objective-C, поэтому в итоге возникает несоответствие импеданса типа между понятием String диапазона и понятием NSString NSRange. Самое простое решение - остаться в мире 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))
0 голосов
/ 07 октября 2019

На самом деле нет точного способа указать диапазон 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)

Примечание: Будьте внимательны, указав допустимый диапазон, иначе произойдет сбой, как если бы вы использовали смещение за пределами конца строкив вашем примере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...