簡體   English   中英

如何在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM