2014-11-24 58 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 
}