【问题标题】:How to count the number of lines in an Objective-C string (NSString)?如何计算 Objective-C 字符串(NSString)中的行数?
【发布时间】:2010-11-08 07:16:20
【问题描述】:

我想在 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;
  }

有没有更简单的方法?

【问题讨论】:

    标签: objective-c cocoa newline enumeration


    【解决方案1】:

    苹果推荐这种方法:

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

    请参阅article。他们还解释了如何计算换行文本的行数。

    【讨论】:

    • 为示例初始化字符串可能是个好主意,无限循环不进行零检查。
    • 这个帐户唯一的原因是字符串以新行开头/结尾。为了解决这个问题,我添加了以下内容:NSString *string = @"this is \nyour string\n"; NSInteger numberOfLines, index, stringLength = [string length]; for (index = 0, numberOfLines = 0; index &lt; stringLength; numberOfLines++) index = NSMaxRange([string lineRangeForRange:NSMakeRange(index, 0)]); if([string hasSuffix:@"\n"] || [string hasSuffix:@"\r"]) numberOfLines += 1; if([string hasPrefix:@"\n"] || [string hasPrefix:@"\r"]) numberOfLines += 1; return numberOfLines;
    【解决方案2】:

    嗯,不是很有效,但看起来不错(ish)的方式是

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

    斯威夫特 4:

    myString.components(separatedBy: .newlines)
    

    【讨论】:

    • 谢谢! !在上述情况下,如何编码?对不起,我是编程初学者
    • 请记住,如果字符串很长,这将比您在问题中发布的代码效率低,因为它将创建一个新的字符串对象对于每一行。确保您了解执行此操作的性能有多重要,以及字符串大小的上限是多少。
    【解决方案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
    }
    

    【讨论】:

      猜你喜欢
      • 2011-08-29
      • 1970-01-01
      • 1970-01-01
      • 2011-12-20
      • 2012-06-26
      • 1970-01-01
      • 1970-01-01
      • 2013-03-28
      • 2014-12-28
      相关资源
      最近更新 更多