在Swift中NSAttributedString比String更多的字符?

时间:2016-03-28 06:22:17

标签: string swift nsattributedstring

我正在尝试将属性添加到Swift String中的某些范围。 我在子串中找到了第一个和最后一个符号的范围,并将它们之间的文本(包括)用红色着色。

let mutableString = NSMutableAttributedString(string: text)
let str = mutableString.string
//Red symbols
var t = 0
let symbols = mutableString.string.characters.count
while t < symbols {
    if str[t] == "[" {
    let startIndex = t
    while str[t] != "]" {
        t += 1
    }
    t += 1
    let endIndex = t

    mutableString.addAttribute(
        NSForegroundColorAttributeName,                    
        value: UIColor.redColor(),   
        range: NSMakeRange(startIndex, endIndex - startIndex))
    }
    t += 1
}

但我发现String和NSMutableAttributedString中的范围不相等。 String中的范围较短(此文本不是Unicode编码)。 是否有某种方法可以找到不在底层字符串中的范围,但在NSAttributedString中找到正确的范围?

示例:

print(mutableString.length) //550
print(mutableString.string.characters.count) //548

为什么会有这种差异?

3 个答案:

答案 0 :(得分:3)

是的,可以在NSMutableAttributedString中找到范围。

示例:

let text = "[I love Ukraine!]"

var start = text.rangeOfString("[")
var finish = text.rangeOfString("]")

let mutableString = NSMutableAttributedString(string: text)

let startIndex = mutableString.string.rangeOfString("[")
let finishIndex = mutableString.string.rangeOfString("]")

来自游乐场的示例输出:enter image description here

答案 1 :(得分:2)

区分String和NSString,即使它们彼此桥接。 String是本机Swift,您可以根据String字符索引定义范围。 NSString是Cocoa(Foundation),您可以根据NSRange定义范围。

答案 2 :(得分:2)

是的,我找到了。 Windows行尾&#34; \ r \ n&#34; 是NSAttributedString中的两个符号,但在Swift String中只有一个字符。 我使用检查我的代码:

let symbols = mutableString.string.characters.count
var extendedSymbols = 0
    while t < symbols {
        if str[t] == "\r\n" { extendedSymbols += 1 }
        else if str[t] == "[" {
            let startIndex = t + extendedSymbols
            while str[t] != "]" {
                t += 1
            }
            t += 1
            let endIndex = t + extendedSymbols

            mutableString.addAttribute(
                NSForegroundColorAttributeName,
                value: UIColor.redColor(), 
                range: NSMakeRange(startIndex, endIndex - startIndex))
        }
        t += 1
    }

谢谢大家的帮助!!!