Как разобрать строку, чтобы преобразовать ее в nsattributedstring - PullRequest
0 голосов
/ 25 января 2019

У меня есть строка в виде

"@{profile: id1} is going to @{profile: id2}'s party"

Как мне преобразовать ее в nsattributedstring

"**Name1** is going to **Name2**'s party"

И id1, и id2 представляют строку.Вы можете получить Name1 путем передачи id1 в функцию с именем getName(by id: String)

Учитывая строку

"@{profile: 735bcec0-1470-11e9-8384-a57f51e70e5f} is \
going to @{profile: 4c0bf620-2022-11e9-99ad-0777e9298bfb} party."

Предположим,

getName(by: "735bcec0-1470-11e9-8384-a57f51e70e5f") -> "Jack"
getName(by: "4c0bf620-2022-11e9-99ad-0777e9298bfb") -> "Rose"

Я бы хотелверните nsattributedstring

"Jack is going to Rose's party"

, где Jack и Rose должны быть выделены жирным шрифтом.

1 Ответ

0 голосов
/ 26 января 2019

Вы можете использовать регулярное выражение в дополнение к replaceCharacters(in:with:) методу NSMutableAttributedString:

    //Prepare attributes for Normal and Bold
    let normalAttr: [NSAttributedString.Key: Any] = [
        .font: UIFont.systemFont(ofSize: 24.0)
    ]
    let boldAttr: [NSAttributedString.Key: Any] = [
        .font: UIFont.boldSystemFont(ofSize: 24.0)
    ]
    //Create an NSMutableAttributedString from your given string
    let givenString = """
    @{profile: 735bcec0-1470-11e9-8384-a57f51e70e5f} is \
    going to @{profile: 4c0bf620-2022-11e9-99ad-0777e9298bfb}'s party.
    """
    let attrString = NSMutableAttributedString(string: givenString, attributes: normalAttr)
    //Create a regex matching @{profile: id} with capturing id
    let pattern = "@\\{profile:\\s*([^}]+)\\}"
    let regex = try! NSRegularExpression(pattern: pattern, options: [])
    let matches = regex.matches(in: givenString, range: NSRange(0..<givenString.utf16.count))
    //Iterate on matches in reversed order (to keep NSRanges consistent)
    for match in matches.reversed() {
        //Retrieve id from the first captured range
        let idRange = Range(match.range(at: 1), in: givenString)!
        let id = String(givenString[idRange])
        let name = getName(by: id)
        //Convert it to an NSAttributedString with bold attribute
        let boldName = NSAttributedString(string: name, attributes: boldAttr)
        //Replace the matching range with the bold name
        attrString.replaceCharacters(in: match.range, with: boldName)
    }
...