![](/img/trans.png)
[英]I need to use this array in objective-c. How do I declare it as an explicit array in objective-c?
[英]How do I declare an array as a constant in Objective-c?
以下代碼給了我錯誤:
// constants.h
extern NSArray const *testArray;
// constants.m
NSArray const *testArray = [NSArray arrayWithObjects: @"foo", @"bar", nil];
我得到的錯誤是initializer element is not constant
或者,如果我拿走指針指示器 (*),我會得到:
statically allocated instance of Objective-C class 'NSArray'
簡而言之,你不能。 除了 NSString 之外,Objective-C 對象只能在運行時創建。 因此,您不能使用表達式來初始化它們。
有幾種方法。
(1) 聲明NSArray *testArray
沒有const
關鍵字,然后有一些代碼來設置在應用程序生命周期中很早就調用的值。
(2) 聲明一個方便的返回數組的類方法,然后在該方法中使用static NSArray *myArray
並將其視為單例(搜索“objective-c singleton”以獲得關於如何實例化的無數答案)。
聚會有點晚了,但是由於您沒有在整個程序過程中更改值,如果您只處理字符串,則可以通過使用C
數組聲明數組來執行以下操作:
extern NSString * const MY_CONSTANT_STRING_ARRAY[];
在您的constants.h
文件中,然后在您的constants.m
您可以像這樣向其中添加對象:
NSString * const MY_CONSTANT_STRING_ARRAY[] = { @"foo", @"bar" };
然后要訪問成員,您可以使用C
sizeof()
運算符執行 for 循環:
這顯然是一個C
數組而不是NSArray
因此您不會像objectAtIndex:
那樣將所有有趣的方法附加到它上面,因此您可以在程序中的某處創建一個輔助函數,該函數使用 I 方法循環遍歷所有字符串上面概述並返回一個NSArray
(甚至NSMutableArray
)。 但是,如果您正在做我所做的並且只需要在整個程序中使用NSString
值的常量數組,則此方法效果最佳。
這樣做將所有字符串數組constants.h
封裝在constants.h
,並且通過在.pch
文件中添加constants.h
仍然可以在整個程序中使用,而不是僅為該值數組創建單例或使用很少的代碼,這有點違背了constants
文件的目的,因為它從constants
文件中刪除了實際的constants
。
根據@JesseGumpo 的評論編輯:
由於使用sizeof()
來確定數組的大小可能存在問題,一個簡單的解決方法是在常量文件中聲明數組的大小,如下所示:
//.h
extern int SIZE_OF_MY_CONSTANTS_ARRAY;
///.m
int SIZE_OF_MY_CONSTANTS_ARRAY = 2;
然后要訪問 for 循環中的成員,您可以這樣做:
for (int i=0; i < SIZE_OF_MY_CONSTANTS_ARRAY; i++)
NSLog(@"my constant string is: %@", MY_CONSTANT_STRING_ARRAY[i]);
是的,這不會動態捕獲數組的大小,但是如果您在常量文件中聲明一個數組,您從一開始就已經知道該數組的大小,因此即使它再添加兩行代碼,它仍然完成在常量文件中包含數組的任務。
如果有人有更多建議或可能知道其他一些C
技巧,請在下面發表評論!
這是一個宏,用於在方法范圍內為靜態實例在一行中執行此操作。
#define STATIC_ARRAY(x, ...) \
static NSArray* x=nil; \
static dispatch_once_t x##onceToken; \
dispatch_once(&x##onceToken, ^{ x = @[ __VA_ARGS__ ]; });
使用示例
STATIC_ARRAY(foo, @"thing1", @"thing2", [NSObject new]);
這很容易:
#define arrayTitle [NSArray arrayWithObjects: @"hi",@"foo",nil]
放在實現之前,沒有分號。
希望能幫助到你。
至於我,對於常量數組使用下面的實現更方便
static NSString * kHeaderTitles [3] = {@ "ACCOUNT DETAILS", @ "SOCIAL NETWORK", @ "SETTINGS"};
static int kNumbers[3] = {1, 2, 3};
我有一個名為“Constants.h”的頭文件,在下一個常量數組中:
#define arrayOfStrings @[@"1", @"2", @"3", @"4"]
#define arraysOfIds @[@(1), @(2), @(3), @(4)]
基本上,當您在代碼中調用 arrayOfStrings 時,它會被替換為 @[@"1", @"2", @"3", @"4"] 並且與 arraysOfIds 相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.