Получить диапазоны с помощью функции separaBy в текстовом представлении - PullRequest
0 голосов
/ 10 июня 2019

Я использую функцию components(separatedBy) для разделения абзацев.

let components = UItextView.text.components(separatedBy: “\n”)

Возвращает массив строк. Мне нужно, чтобы у меня была информация для диапазонов, а также для каждого идентификатора, чтобы можно было его идентифицировать. Я понятия не имею, как бы я поступил так. Нужно ли как-то использовать токены?

РЕДАКТИРОВАТЬ: То, что я подразумеваю под «id», это просто идентификатор, который я могу иметь, чтобы иметь возможность распознать, какой абзац относится к какому компоненту. Это связано с тем, что счет в массиве будет неточным, если добавить абзац между двумя уже существующими абзацами.

Для диапазона я хочу Свифт Range разделенного абзаца. Пример: Range<String.Index>(3..<8)

Ответы [ 2 ]

3 голосов
/ 10 июня 2019

Более функциональный подход, чем предложил PGDev:

let str = """
Paragraph 1
Paragraph 2
Paragraph 3
Paragraph 4
"""

struct ParagraphModel: Hashable {
    let text: String
    let range: Range<String.Index>

    init(withText text: String, range: Range<String.Index>) {
        self.text = text
        self.range = range
    }

    func hash(into hasher: inout Hasher) {
        hasher.combine(text)
        hasher.combine(range.lowerBound)
        hasher.combine(range.upperBound)
    }
}

let components = str.components(separatedBy: "\n")
let models = components.compactMap { component -> ParagraphModel? in
    if let range = str.range(of: component) {
        return ParagraphModel(withText: component, range: range)
    }
    return nil
}

id будет hashValue модели.

0 голосов
/ 10 июня 2019

Давайте предположим, что у нас есть текст вроде:

let text = """
        This returns an array of strings. I am needing to be able to have the info for the ranges and also an ‘id’ for each one to be able to identify it. I have no idea how I would go about doing this. Do I need to make use of tokens somehow?
        EDIT: What I mean by 'id' is just an identifier I can have to be able to recognise what paragraph relates to which component. This is because counting through the array would not be accurate if a paragraph is added between 2 already existing paragraphs.
        """

Получение components из text, разделенных "\n",

let arr = text.components(separatedBy: "\n")

Теперь нам нужно 3 вещидля каждого element в arr - String, Identifier, Range

    var requiredArray = [(String, Range<String.Index>, Int)]()

    for (index, str) in arr.enumerated() {
        if let range = text.range(of: str) {
           requiredArray.append(str, range, index)
        }
    }

    print(requiredArray)

В приведенном выше коде

  1. мы использовали index из str в arr как его identifier.
  2. Рассчитано range из str в text

Следовательно, requiredArray содержит все paragraphs в text вместе с их identifierи range.

Дайте мне знать, если у вас все еще есть проблемы.

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