1. 程式人生 > 實用技巧 >iOS-class修飾符的解釋及用法

iOS-class修飾符的解釋及用法

類屬性 (Objective-C Class Properties)

官方解釋

先看下它在Xcode8 release版本中官方給出的解釋:
Objective-C now supports class properties, which interoperate with Swift type properties. They are declared as: @property (class) NSString *someStringProperty;. They are never synthesized. (23891898) 簡單來說就是Objective-C現在支援與Swift型別屬性進行互動轉換的類屬性,這些屬性永遠不會synthesized,不會生成set和get方法。
就解釋來看,似乎Objective-C獲得這一功能是提高與Swift的互通性。 向Objective-C新增 class 屬性對映到Swift中使用類變數。不過我們可以在OC中使用這個功能,更方便愉快的coding。

用法

我們新建一個TestCar類,同時有一個屬性 desc 以便於在其他類訪問我們在.h檔案裡面宣告一個屬性
1 @interface TestCar : NSObject
2  
3 @property (nonatomic, copy, class) NSString *desc;
4  
5 @end
當我們宣告一個class屬性的時候,編譯器會發出警告!這也就是前面說的They are never synthesized. 這兩個屬性永遠不會synthesized,因此如果我們不顯式的新增setter和getter方法,XCode就會提示警告資訊使用@dynamic或者是提供setter和getter方法; 注意在getter方法前面使用 + 讓其成為一個類的方法 10.59.43.png
接下來我們簡單實現一下set 和 get方法,以便在其他地方呼叫
 1 static NSString * _desc = nil; //這裡我們可以把它宣告為靜態變數
 2  
 3 @implementation TestCar
 4  
 5 + (NSString *)desc{
 6 if (!_desc) {
 7 _desc = [[NSString alloc] init];
 8 }
 9 return _desc;
10 }
11  
12 + (void)setDesc:(NSString *)desc{
13 _desc = desc;
14 }
15 @end

接下來就可以呼叫了,可以使用類名上的普通點語法訪問類屬性
1 TestCar.desc = @"布加迪限量";
2 NSLog(@"%@", TestCar.desc);
這裡就可以正常輸出內容了 同時也需要注意的是,由於這是Xcode 8中的LLVM編譯器的一項功能,因此它可以在低於iOS 10的環境下使用。

總結一下

假如一個類裡面都是類方法,或者想在其他地方訪問一個類裡面的資訊,並且這個類裡面還有一些屬性的話,那麼可以使用class修飾生成類屬性,這樣呼叫的時候可以直接使用類名呼叫,不用再生成一個該類的例項來呼叫了,使用類屬性會更方便一點。 當然想使用這個功能你要付出的就是自己生成set和get方法。想必這不是什麼難題! 屬性用class修飾同時你也可以修飾為readonly只讀,它並不會影響其他功能。