2014-11-24 42 views
1

Apple的Text Layout Programming Guide包含Objective-C代碼的以下片段來計算NSString中的行數。Swift中的計數行

NSString *string; 
unsigned numberOfLines, index, stringLength = [string length]; 
for (index = 0, numberOfLines = 0; index < stringLength; numberOfLines++) 
    index = NSMaxRange([string lineRangeForRange:NSMakeRange(index, 0)]); 

什麼Swift的等效使用本地字符串?

+3

爲什麼你沒有展示你到目前爲止所嘗試的內容,以便它看起來不像是「爲我翻譯這個代碼」的問題? – 2014-11-24 22:08:21

+0

我寫了很少的Swift代碼,所以我可能錯誤地認爲操作String.Index範圍的挑戰是複雜的,但我想從這個問題的最佳方法中學習,而不是我可能很差的方法的變體。 – jspinks 2014-11-24 22:30:43

+0

最壞的情況下,「Swift等效」可以將它放入一個函數中,將其導入橋接聽到的文件,並從Swift中調用ObjC C樣式函數。 – nhgrif 2014-11-24 23:17:00

回答

1

這是我找到的問題的解決方案,所以我會在這裏留下它以防其他人發現它有用。

var text = "Line 1\nLine 2\nLine 3" 
for var range = text.startIndex...text.startIndex; range.endIndex < text.endIndex; 
     range = range.endIndex..<range.endIndex { 
    range = text.lineRangeForRange(range) 
} 
+0

有一個「致命錯誤:不能增加endIndex」:( – hyouuu 2015-01-24 07:56:49

0

這裏是(只是您發佈的指南的一個普通翻譯):

func countLines(textView: UITextView) -> Int { 
    let layoutManager = textView.layoutManager 
    var numberOfLines = 0 
    var index = 0 
    var lineRange = NSRange() 
    var numberOfGlyphs = layoutManager.numberOfGlyphs 
    for(numberOfLines, index; index < numberOfGlyphs; numberOfLines++){ 
     layoutManager.lineFragmentRectForGlyphAtIndex(index, effectiveRange: &lineRange) 
     index = NSMaxRange(lineRange); 
    } 
    return numberOfLines 
} 

,或者如果你需要一個特定的範圍在textcode(像我一樣):

func countLinesInRange(textView: UITextView, range: NSRange) -> Int{ 
    let layoutManager = textView.layoutManager 
    var numberOfLines = 0 
    var index = range.location 
    var lineRange = range 
    var numberOfGlyphs = layoutManager.numberOfGlyphs 
    for(numberOfLines, index; index < range.location+range.length; numberOfLines++){ 
     layoutManager.lineFragmentRectForGlyphAtIndex(index, effectiveRange: &lineRange) 
     index = NSMaxRange(lineRange); 
    } 
    return numberOfLines 
}