在 const NSString *const[] 中查找 NSString

Find NSString in const NSString *const[]

我有一个 constants.h 文件并声明:

extern NSString * check_array_editable[];

在 constants.m 我设置:

NSString * check_array_editable[] = { @"1", @"2", @"3", @"4", @"5", @"6", @"7", @"9", @"11", @"14" , @"17", @"18", @"21" };

所以不必调用初始化程序,如果我使用 NSArray 而不是集合,我必须做什么。

现在我导入 constants.h 并且可以访问 check_array_editable[]。 但是我如何才能像使用 NSArray:

一样获得特定项目的长度和索引
 BOOL isTheObjectThere = [check_array_editable containsObject: @"my string"];
 NSUInteger indexOfTheObject = [check_array_editable indexOfObject: @"my string"];

---编辑 我最终决定使用 NSArray 并在 constants.h

中使用 inizalise void
NSArray * check_array_invisible;
NSArray * check_array_editable;
NSArray * check_array_texteingabe;
NSArray * check_array_assistent;
NSArray * check_array_functionfield;
+(void)initialize{
  check_array_invisible = @[@10, @13, @34, @35];
  check_array_editable = @[@1,@2, @3, @4, @5, @6, @7, @9, @11, @14 , @17, @18, @21 ];
  check_array_texteingabe = @[@1, @2, @3, @9, @11, @14];
  check_array_assistent = @[@16, @35];
  check_array_functionfield = @[@32];
}

根据你的声明,你的数组是 C 样式数组,因此你将无法使用熟悉的方法,如 containsObjectindexOfObject,但你应该将其作为 C 样式数组处理,并且像这样搜索

NSString *s = @"1";
int i = 0;
while(check_array_editable[i]) {
    if( [check_array_editable[i] isEqualToString:s]) {
        NSLog(@"yeah");
        break;
    }
    i++;
}

相反,您可以在实现文件中这样声明数组:

#define check_array_editable@[@"1", @"2", @"3", @"4"]

现在您可以使用 indexOfObject

等有趣的方法

示例:

NSLog( @"%zd",[arrayOfStrings indexOfObject:@"2"]);

结果:

2015-07-16 11:04:47.620 PROJ[881:13857] 1

更多信息here , here and here

您可以使用 sizeof 来确定 C 数组中的元素数。取 sizeof 一个 C 数组:

sizeof(check_array_editable)

returns 所有元素的总大小(在您的示例中,答案是 104 [假设是 64 位二进制文​​件]);在您的情况下,每个元素都是一个 NSString * ,其大小由下式给出:

sizeof(NSSString *)

这将 return 8 [再次假设 64 位]。只需将总长度除以元素长度即可:

sizeof(check_array_editable) / sizeof(NSSString *)

你得到数组中元素的数量(在你的例子中是 13)。

重要:以上内容适用于声明为数组的变量。用 C 指针类型声明的变量,然后设置为引用动态分配的内存,可能可以用作数组,但它不是数组。取 sizeof 这样一个变量 return 它的大小 - 指针的大小 - 而不是它当前引用的大小。

HTH