Цвет строки на основе вхождений в строке переменной - PullRequest
1 голос
/ 02 мая 2020

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

Сначала я начал с красного цвета, но не могу понять, как чтобы заставить его работать.

Мой код пока:

let oldString = "TEST STRING TO COLOUR IT WORDS EXIST" //sample of a variable string that may or may not contain wors that need coloring

let newString = stringColorCoding(stringToColor: oldString, colorRed: "TO, POT, TEST", colorYellow: "EXIST, TOP", colorGreen: "AB, +TA, -XY, WORDS")

func stringColorCoding(stringToColor: String, colorRed: String, colorYellow: String, colorGreen: String)
{

let attrStr = NSMutableAttributedString(string: stringToColor)
let inputLength = attrStr.string.count
let searchStringRed = colorRed
let searchLengthRed = searchStringRed.characters.count
var rangeRed = NSRange(location: 0, length: attrStr.length)

while (range.location != NSNotFound) 
{
  range = (attrStr.string as NSString).range(of: searchStringRed, options: [], range: range)
     if (range.location != NSNotFound) 
   {
     attrStr.addAttribute(NSAttributedString.Key.foregroundColor, value: UIColor.systemRed, range: NSRange(location: range.location, length: searchLengthRed))
     range = NSRange(location: range.location + range.length, length: inputLength - (range.location + range.length))
     }
  }
 return attrStr
}

1 Ответ

0 голосов
/ 02 мая 2020

То, как вы это делаете, довольно сложно. Я бы использовал enumerateSubstrings, чтобы получить каждое слово в строке. И тогда вместо того, чтобы передавать через запятую строку с поисковыми терминами, я передаю массив строк поиска.

extension String {
    func highlighted(
        redText: [String],
        yellowText: [String],
        greenText: [String]
    ) -> NSAttributedString {

        let result = NSMutableAttributedString(string: self)
        enumerateSubstrings(in: startIndex..<endIndex, options: .byWords) {
            (substring, substringRange, _, _) in
            guard let substring = substring else { return }
            if redText.contains(substring) {
                result.addAttribute(
                    .foregroundColor,
                    value: UIColor.systemRed,
                    range: NSRange(substringRange, in: self)
                )
            }
            if yellowText.contains(substring) {
                result.addAttribute(
                    .foregroundColor,
                    value: UIColor.systemYellow,
                    range: NSRange(substringRange, in: self)
                )
            }
            if greenText.contains(substring) {
                result.addAttribute(
                    .foregroundColor,
                    value: UIColor.systemGreen,
                    range: NSRange(substringRange, in: self)
                )
            }
        }
        return result
    }
}

Использование выглядит следующим образом:

let highlighted = "TEST TO COLOUR IT WORDS EXIST".highlighted(
    redText: ["TO", "POT", "TEST"],
    yellowText: ["EXIST", "TOP"],
    greenText: ["AB", "+TA", "-XY", "WORDS"]
)
...