2015-10-04 32 views
9

我試圖確定String中給定字符串出現的索引,然後使用這些索引生成NSRange以便將屬性添加到NSMutableAttributedString。問題是rangeOfString回報Range<Index>addAttributes:range:預計的NSRange。我試圖創建從Range的開始和結束索引的NSRange都失敗了,因爲String.CharacterView.Index不是Int,因此它不會編譯。在NSAttributedString API中使用範圍<Index>和NSRange

一個如何使用Range<Index>值來創建一個NSRange

var originalString = "Hello {world} and those who inhabit it." 

let firstBraceIndex = originalString.rangeOfString("{") //Range<Index> 
let firstClosingBraceIndex = originalString.rangeOfString("}") 

let range = NSMakeRange(firstBraceIndex.startIndex, firstClosingBraceIndex.endIndex) 
//compile time error: cannot convert value of type Index to expected argument type Int 

let attributedString = NSMutableAttributedString(string: originalString) 
attributedString.addAttributes([NSFontAttributeName: boldFont], range: range) 
+0

我看不到你在任何地方調用'rangeOfString'。你的代碼沒有意義。什麼是'originalString(「{」)'?這不可能是你真正的代碼;這是無稽之談。 – matt

+0

@matt錯過了第二和第三行的部分,更新了 – Joey

+0

我的答案保持不變。如果你現在有'let firstBraceIndex = originalString.rangeOfString(「{」)',說'let firstBraceIndex =(originalString as NSString).rangeOfString(「{」)'。現在你有一個NSRange,可以從那裏繼續。 – matt

回答

8

如果你開始你投作爲一個可可的NSString原始字符串:

var originalString = "Hello {world} and those who inhabit it." as NSString 

...那麼你的範圍的結果將是NSRange,你就可以把他們回到可可。

+0

看看我的書,它進入這個話題的一些細節:http://www.apeth.com/swiftBook/ch03.html#_string – matt

+0

沒辦法用本地斯威夫特String要做到這一點? – Joey

+0

這是用本地Swift字符串做的方法。我看不到你在追求什麼。我已經爲你解決了這個問題。你需要我重寫你的整個代碼並證明它嗎?試試我說的。 – matt

4

若要使NSRange你需要得到的範圍內整數的起始位置和長度。您可以使用distance(from:to:)方法對你originalString做到這一點:

let rangeStartIndex = firstBraceIndex!.lowerBound 
let rangeEndIndex = firstClosingBraceIndex!.upperBound 

let start = originalString.distance(from: originalString.startIndex, to: rangeStartIndex) 
let length = originalString.distance(from: rangeStartIndex, to: rangeEndIndex) 

let nsRange = NSMakeRange(start, length) 

let attributedString = NSMutableAttributedString(string: originalString) 
attributedString.addAttributes([NSFontAttributeName: boldFont], range: nsRange) 

要獲得startingLocation,得到了originalString的的startIndex的距離,給你想要的範圍的起始索引(而你的情況是在firstBraceIndex.lowerBound如果要包括{,或firstBraceIndex.upperBound如果你不這樣做)。然後爲了得到你的範圍的長度,從你的範圍的起始索引到結束索引獲得距離。

我只是強制解開你的firstBraceIndexfirstClosingBraceIndex以使代碼更易於閱讀,但當然最好是妥善處理這些潛在的零。