2009-07-06 23 views
25

Tôi muốn đếm các dòng trong một NSString trong Objective-C.Làm thế nào để đếm số dòng trong chuỗi mục tiêu-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; 
    } 

Có cách nào dễ dàng hơn không?

Trả lời

33

tốt, một cách không phải là rất hiệu quả, nhưng thoải mái (ish) tìm kiếm là

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

Cảm ơn bạn! ! Trong trường hợp trên, làm thế nào để mã? Xin lỗi tôi là người lập trình – freddiefujiwara

+4

Hãy nhớ rằng nếu chuỗi quá dài, điều này sẽ * nhiều * kém hiệu quả hơn mã như bạn đã đăng trong câu hỏi, vì nó sẽ tạo đối tượng chuỗi mới cho mỗi dòng. Hãy chắc chắn rằng bạn hiểu hiệu suất quan trọng là nơi bạn đang làm điều này, và những gì các ràng buộc trên kích thước chuỗi sẽ được. – smorgan

43

Apple khuyến cáo phương pháp này:

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

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

Xem article. Họ cũng giải thích cách đếm các dòng văn bản được bao bọc.

+12

Trong mã hiện đại, ta nên sử dụng NSUInteger. –

+0

Giải pháp tuyệt vời .. –

+0

Có lẽ sẽ là một ý tưởng tốt để khởi tạo chuỗi cho mẫu, vòng lặp vô hạn mà không cần kiểm tra nil. – malhal

3

Nếu bạn muốn đưa vào tài khoản chiều rộng của văn bản, bạn có thể làm điều này với 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 
} 
Các vấn đề liên quan