2009-07-06 49 views
25

Objective-CでNSStringの行を数えたいと思います。Objective-C文字列(NSString)の行数を数えるには?

NSInteger lineNum = 0; 
    NSString *string = @"abcde\nfghijk\nlmnopq\nrstu"; 
    NSInteger length = [string length]; 
    NSRange range = NSMakeRange(0, length); 
    while (range.location < length) { 
     range = [string lineRangeForRange:NSMakeRange(range.location, 0)]; 
     range.location = NSMaxRange(range); 
     lineNum += 1; 
    } 

もっと簡単な方法はありますか?

答えて

33

だけでなく、非常に効率的ではなく、素敵ではない(っぽい)の道を探して

NSString *string = @"abcde\nfghijk\nlmnopq\nrstu"; 
NSInteger length = [[string componentsSeparatedByCharactersInSet: 
           [NSCharacterSet newlineCharacterSet]] count]; 
+0

ありがとうございます! ! 上記の場合、どのようにコードするのですか? 申し訳ありませんが、私はプログラミングの初心者です – freddiefujiwara

+4

文字列が非常に長い場合は、すべての行に新しい文字列オブジェクトが作成されるため、質問に投稿したようなコードよりも効率が悪くなります。あなたがこれをやっている場所でのパフォーマンスの重要性と、文字列サイズの上限が何であるかを理解しておいてください。 – smorgan

43

Appleは、この方法を推奨している:

NSString *string; 
unsigned numberOfLines, index, stringLength = [string length]; 

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

articleを参照してください。ラップされたテキストの行数をカウントする方法についても説明します。

+12

現代のコードでは、NSUIntegerを使うべきです。 –

+0

素晴らしい解決策。 –

+0

おそらく、無限ループなしで無限ループのサンプルの文字列を初期化することは良い考えです。 – malhal

3

アカウントにテキストの幅を取りたい場合は、あなたがTextKit(iOS7 +)でこれを行うことができます。

func numberOfLinesForString(string: String, size: CGSize, font: UIFont) -> Int { 
    let textStorage = NSTextStorage(string: string, attributes: [NSFontAttributeName: font]) 

    let textContainer = NSTextContainer(size: size) 
    textContainer.lineBreakMode = .ByWordWrapping 
    textContainer.maximumNumberOfLines = 0 
    textContainer.lineFragmentPadding = 0 

    let layoutManager = NSLayoutManager() 
    layoutManager.textStorage = textStorage 
    layoutManager.addTextContainer(textContainer) 

    var numberOfLines = 0 
    var index = 0 
    var lineRange : NSRange = NSMakeRange(0, 0) 
    for (; index < layoutManager.numberOfGlyphs; numberOfLines++) { 
     layoutManager.lineFragmentRectForGlyphAtIndex(index, effectiveRange: &lineRange) 
     index = NSMaxRange(lineRange) 
    } 

    return numberOfLines 
} 
関連する問題