2016-03-28 55 views
0

我想在Swift字符串中添加一些範圍的屬性。 我在子串中找到了第一個和最後一個符號的範圍,並將它們之間的文本(包括)以紅色着色。在Swift NSAttributedString比字符串有更多的字符?

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中的範圍不相等。字符串中的範圍更短(此文本不是Unicode編碼)。 有沒有一種方法來找到範圍不在基礎字符串,但在NSAttributedString中找到它正確?

例子:

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

爲什麼這種差異?

+0

「此文本不是Unicode編碼」_that_是什麼意思? – matt

+0

是Windows CP1251編碼 –

+1

「是Windows CP1251編碼」好吧,不是。一個字符串是Unicode。創建字符串時,您應該從Windows CP1251轉換而來。你現在擁有的東西可能會是一團糟。 – matt

回答

1

字符串和NSString的區分,即使它們被橋接於彼此。字符串是本地Swift,並且您根據字符串字符索引定義範圍。 NSString是Cocoa(Foundation),你可以用NSRange來定義一個範圍。

+0

謝謝。我發現類似的問題http://stackoverflow.com/questions/29832930/swift-string-count-vs-nsstring-length-not-equal –

+1

並看到我的在線書籍,在這一節:http://www.apeth。 com/swiftBook/ch03.html#SBmismatch – matt

+0

一本好書!謝謝,馬特! –

2

是的,可以在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

是的,我找到了。 Windows結束行「\ r \ n」是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 
    } 

感謝大家的幫助!