调用rangeOfCharacterFromSet时会发生什么?

时间:2016-06-24 09:33:52

标签: ios objective-c nscharacterset

以下代码的含义是什么 我知道这是为了避免在TextField中键入数字以外的字符。但是这个函数rangeOfCharacterFromSet背后的实际情况。 它将返回什么。

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

在文件中说

  

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

我甚至无法理解什么是接收器以及为什么 NSNotFound 在这里使用。什么是 aSet

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

3 个答案:

答案 0 :(得分: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 callTheMethod]。 Abount NSCharacterSet,我认为该文件清楚地解释了:

  

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

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

希望它有所帮助。

答案 1 :(得分:1)

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

然而,......

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

L[5]

在第一行中,您将消息NSCharacterSet *digits = [NSCharacterSet decimalDigitCharacterSet]; [string rangeOfCharacterFromSet:digits]; 发送到decimalDigitCharacterSet的类对象。在第二行中,您将消息NSCharacterSet发送到rangeOfCharacterFromSet:digits的实例对象。

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

  

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

由于范围包含两个普通整数,因此您无法为它们指定NSString来标记错误。它将为0.因此分配了幻数(nil)。但是,请不要关心这一点,只需检查0的长度。

该集是字符集,包含数字的集合。

答案 2 :(得分:0)

如果字符串包含的字符不是数字,则代码执行的操作是返回NO

如果您致电[myString rangeOfCharacterFromSet:mySet],则myStringreceivermySetaSet

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