0

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

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

在文档中它说

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

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

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

4

3 回答 3

2
- (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。

希望能帮助到你。

于 2016-06-24T10:22:02.983 回答
2

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

然而,……</p>

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

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

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

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

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

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

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

于 2016-06-24T10:30:05.023 回答
0

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

如果你打电话[myString rangeOfCharacterFromSet:mySet]myStringreceivermySetaSet

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

于 2016-06-24T09:43:51.180 回答