【问题标题】:Shortcut to generate an NSRange for entire length of NSString?为整个 NSString 生成 NSRange 的快捷方式?
【发布时间】:2013-02-10 07:55:44
【问题描述】:

有没有一种简短的方法可以说“整个字符串”而不是输入:

NSMakeRange(0, myString.length)]

这种代码中最长的部分是最不重要的似乎很愚蠢(因为我通常想在整个字符串中搜索/替换)......

[myString replaceOccurrencesOfString:@"replace_me"
                          withString:replacementString
                             options:NSCaseInsensitiveSearch
                               range:NSMakeRange(0, myString.length)];

【问题讨论】:

  • 如果你需要超过5次,那么你可以做一个方法/类别,但是5次以下你的NSMakeRange(0, myString.length)]会更短,不是吗?

标签: ios objective-c nsstring nsrange


【解决方案1】:

我不知道。但您可以轻松添加NSString 类别:

@interface NSString (MyRangeExtensions)
- (NSRange)fullRange
@end

@implementation NSString (MyRangeExtensions)
- (NSRange)fullRange {
  return (NSRange){0, self.length};
}

【讨论】:

  • 天哪,我们甚至给它起了相同的名字。
【解决方案2】:

功能?分类方法?

- (NSRange)fullRange
{
    return (NSRange){0, [self length]};
}

[myString replaceOccurrencesOfString:@"replace_me"
                          withString:replacementString
                             options:NSCaseInsensitiveSearch
                               range:[myString fullRange]];

【讨论】:

  • 哈。太棒了,我们都将它命名为 fullRange,并且我们都同时使用了新的复合文字。
  • 确实如此。并同时发表评论!
  • 文字工作得很好,但你也可以 return NSMakeRange(0, [self length]);如果你愿意。
【解决方案3】:

这不是更短,但是……哦,好吧

NSRange range = [str rangeOfString:str];

【讨论】:

  • 聪明。但是我不愿介绍可能需要大量 CPU 工作(将长字符串与自身匹配)的相对较小的好处,即程序员对我来说打字少一点。
  • 你是对的,有时代码多一点会使它更具可读性和效率。
  • 我也使用了这个,但遇到了一个问题:如果你的字符串恰好是空的 (@""),你会得到 {NSNotFound, 0}。
  • 这个函数只解析有效范围为@"{0, 13}"等,它不会为字符串的全长创建NSRange,如果字符串不包含有效范围,而是随机字符串,它返回@987654325 @ 范围。 nshipster.com/nsrange
【解决方案4】:

斯威夫特

NSMakeRange(0, str.length)

extension:

extension NSString {
    func fullrange() -> NSRange {
        return NSMakeRange(0, self.length)
    }
}

【讨论】:

  • 正确。但问题是“为整个 NSString 长度生成 NSRange 的快捷方式”
  • 这个问题也是关于Objective-C的。如果你使用 Swift,那么也使用 String。
  • NSString 在 Swift 中可能已经过时,但 NSAttributedString 不是,并且相同的代码适用于它(显然,除了类名)。
【解决方案5】:

斯威夫特 2:

extension String {
    var fullRange:Range<String.Index> { return startIndex..<endIndex }
}

let swiftRange = "abc".fullRange

let nsRange = "abc".fullRange.toRange

【讨论】:

  • 对于"abc".fullRange.toRange,我得到编译时错误:“'Range' 类型的值(又名'Range')没有成员'toRange ’。”我正在使用 Swift 3.1 运行 Xcode 8.3.3。
【解决方案6】:

Swift 4+,适用于NSRegularExpressionNSAttributedString

extension String {
    var nsRange : NSRange {
        return NSRange(self.startIndex..., in: self)
    }

    func range(from nsRange: NSRange) -> Range<String.Index>? {
        return Range(nsRange, in: self)
    }
}

【讨论】:

    猜你喜欢
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-05
    • 2017-10-22
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多