【问题标题】:What happens when rangeOfCharacterFromSet is called?调用 rangeOfCharacterFromSet 时会发生什么?
【发布时间】:2016-06-24 09:33:52
【问题描述】:

以下代码是什么意思, 我知道这是为了避免在 TextField 中输入数字以外的字符。但是这个函数 rangeOfCharacterFromSet 背后实际发生了什么。 它将返回什么。

if ([string rangeOfCharacterFromSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]].location != NSNotFound)
        return NO;

在文档中说

在第一个字符的接收者中查找并返回范围 从给定的字符集。第一个接收器的范围 从 aSet 中找到的字符。如果没有,则返回 {NSNotFound, 0} 的范围 找到 aSet 中的字符

我什至无法理解receiver是什么以及为什么在这里使用NSNotFound。那是什么aSet

请用一些例子来解释我以便更好地理解(比如当我按下数字以外的字符时会发生什么)

【问题讨论】:

    标签: ios objective-c nscharacterset


    【解决方案1】:
    - (void)test {
    NSString *str = @"input content";
    NSCharacterSet *characterSet = [NSCharacterSet decimalDigitCharacterSet];
    NSRange range = [str rangeOfCharacterFromSet:characterSet];
    NSLog(@"location:%ld, length:%ld", range.location, range.length);
    // range.location is 9223372036854775807, in fact it is a NSNotFound which means not exists, range.length is 0
    
    str = @"input 1";
    range = [str rangeOfCharacterFromSet:characterSet];
    NSLog(@"location:%ld, length:%ld", range.location, range.length);
    // range.location is 6, range.length is 1
    
    str = @"input 123";
    range = [str rangeOfCharacterFromSet:characterSet];
    NSLog(@"location:%ld, length:%ld", range.location, range.length);
    // range.location is 6, range.length is 1
    
    str = @"123 input 123";
    range = [str rangeOfCharacterFromSet:characterSet];
    NSLog(@"location:%ld, length:%ld", range.location, range.length);
    // range.location is 0, range.length is 1
    }
    

    在测试中str为receiver,当你调用一个方法时,谁调用谁是reciever:[receiver callTheMethod]。关于NSCharacterSet,我觉得文档解释的很清楚:

    NSCharacterSet 对象表示一组符合 Unicode 的字符。 NSString 和 NSScanner 对象使用 NSCharacterSet 对象将字符组合在一起以进行搜索操作,以便它们可以在搜索过程中找到任何特定字符集。集群的两个公共类 NSCharacterSet 和 NSMutableCharacterSet 分别声明了静态和动态字符集的编程接口。

    NSRange 是 [str rangeOfCharacterFromSet:characterSet] 的结果,它是一个结构体,range.location 是 str 中包含在 characterSet 中的第一个索引,它是一个 NSInteger 类型,当 str 不退出时的内容characterSet 它将是一个非常大的整数,它表示 NSNotFound。 range.length 的意思就是单词,在这里,除非 range.location 是 NSNotFound,否则它总是为 1。

    希望对您有所帮助。

    【讨论】:

      【解决方案2】:

      好吧,让我这样说:如果你不知道接收器是什么,你应该阅读一本关于 Objective-C 的初学者书籍。

      然而,……

      接收者是你发送消息的对象。所以让它更容易理解:

      NSCharacterSet *digits = [NSCharacterSet decimalDigitCharacterSet];
      [string rangeOfCharacterFromSet:digits];
      

      在第一行中,您将消息decimalDigitCharacterSet 发送到NSCharacterSet 的类对象。在第二行中,您将消息rangeOfCharacterFromSet:digits 发送到NSString 的实例对象。

      让我们翻译文档,第 1 步:

      查找并返回给定字符集中第一个字符的字符串范围(以前:接收者)。从 aSet 中找到的第一个字符的接收器范围。如果没有找到 aSet 中的字符,则返回 {NSNotFound, 0} 范围

      由于范围包含两个普通整数,因此您不能将nil 分配给它们以标记错误。它将是 0。因此分配了一个幻数 (NSNotFound)。不过这个不用管,看0上的长度就行了。

      set 是字符集,一个包含数字的集合。

      【讨论】:

        【解决方案3】:

        如果字符串包含不是数字的字符,代码的作用是返回NO

        如果您拨打[myString rangeOfCharacterFromSet:mySet]myStringreceivermySetaSet

        NSNotFound 只是一个任意常量,表示未找到集合中的任何字符。

        【讨论】:

          猜你喜欢
          • 2010-12-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-11-11
          • 2013-09-17
          • 2016-11-11
          • 1970-01-01
          相关资源
          最近更新 更多