代码之家  ›  专栏  ›  技术社区  ›  johnbakers

iOS7对此NSMutableCharacterSet算法的反应不同

  •  2
  • johnbakers  · 技术社区  · 13 年前

    我有这个基本的文本检查代码,在iOS 7之前一直运行良好:

       NSMutableCharacterSet*testchars=[NSCharacterSet alphanumericCharacterSet];
      [testchars addCharactersInString:@".-"];
    
      BOOL didFindBadCharacters = ([userInput rangeOfCharacterFromSet:[testchars invertedSet]].location != NSNotFound);
    

    这里的简单想法是检查用户的输入 userInput 找到一个BOOL true 如果用户输入的任何字符是 不 字母数字或包含点或破折号。也就是说,这些条目很好,但空格或符号就不好了。

    在iOS 7之前,这一直有效。我不明白为什么iOS 7会有所不同,但现在如果用户输入句点或破折号,BOOL将返回 真实的 当我登录以确保没有其他字符(如空格)时,会触发错误。

    为什么这会在iOS 7上失败?看起来像是基本的语言特征。

    2 回复  |  直到 13 年前
        1
  •  7
  •   Sergey Kalinichenko    13 年前

    为什么这会在iOS 7上失败?

    我唯一的猜测是,为什么iOS 7会有所不同,是他们修复了一个错误:在iOS 7之前,cocoa曾为内置字符集返回一个可变的字符集。

    文件中没有说明 NSCharacterSet 从返回 alphanumericCharacterSet 应该是可变的,所以第一行的赋值是无效的,即使编译器没有抱怨。

    这应该可以解决问题:

    NSMutableCharacterSet*testchars = [[NSCharacterSet alphanumericCharacterSet] mutableCopy];
    
        2
  •  0
  •   TotoroTotoro    13 年前

    我不确定您的代码的第一行是否达到了您认为的效果。它可能会分配一个 NSCharacterSet 反对 testchars (也就是说,一个不可变的集合)。因此,第二行可能什么也没做。尝试启动您的 测试字符 作为一个适当的 NSMutableCharacterSet ,我打赌你的代码那时会起作用。

    正如@dasblinkenlight正确地建议的那样,这应该会奏效:

    NSMutableCharacterSet *testchars = [[NSCharacterSet alphanumericCharacterSet] mutableCopy];