2009-07-06 13 views
25

Chcę policzyć linie w NSString w Objective-C.Jak liczyć liczbę linii w ciągu 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; 
    } 

Czy jest łatwiejszy sposób?

Odpowiedz

33

dobrze, nie bardzo wydajny, ale ładne (owski) poszukuje sposobów jest

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

Dziękujemy! ! W powyższej sprawie, jak kodować? Przykro mi, że jestem początkującym programistom. – freddiefujiwara

+4

Pamiętaj, że jeśli ciąg znaków będzie bardzo długi, będzie * znacznie * mniej wydajny niż kod taki, jaki napisałeś w pytaniu, ponieważ utworzy nowy obiekt typu string dla każdej linii. Upewnij się, że rozumiesz, jak ważna jest wydajność tam, gdzie to robisz i jaka będzie górna granica rozmiaru łańcucha. – smorgan

43

Apple zaleca tę metodę:

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

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

Patrz article. Wyjaśniają również sposób liczenia wierszy zawijanego tekstu.

+12

We współczesnym kodzie należy użyć NSUInteger. –

+0

Fantastyczne rozwiązanie .. –

+0

Prawdopodobnie byłby dobry pomysł, aby zainicjować ciąg dla próbki, nieskończonej pętli bez zerowej kontroli. – malhal

3

Jeśli chcesz wziąć pod uwagę szerokość tekstu, można to zrobić z 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 
} 
Powiązane problemy