譯 Objective C 類屬性

2021-07-25 07:50:59 字數 3356 閱讀 1472

翻譯自:objective-c class properties

譯者:haley_wong

由於swift 3.0 出了太多令人興奮的新特性,人們很容易忽略 objective-c中的小改動。蘋果展示objective-c 很可能是為了提高swift互操作性(譯者注:互操作性主要是指oc**與swift**相互轉換),但是仍然很歡迎開發者用objective-c來完成工作。

在這篇文章中,我們就來看看objective-c中新新增的類屬性。

摘自 xcode 8正式版中的說明:

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 現在支援類屬性了,與oc 中的類屬性對應的是swift的型別屬性。

它們是這樣宣告的:

@property (class) nsstring *somestringproperty;

類屬性永遠不會被自動合成。

為了實驗一下,我們來建立乙個包含幾個型別的簡單 objective-c 類。這是我們的user類介面,它看起來是這樣的:

@inte***ce

user : nsobject

@property (class, nonatomic, assign, readonly) nsinteger usercount;

@property (class, nonatomic, copy) nsuuid *identifier;

+ (void)resetidentifier;

@end

下面來說明一下我們這兩個類屬性,第乙個是唯讀的integer型別,第二個是可讀可寫具有copy特性的nsuuid型別。要注意有屬性宣告的類。

實現也很簡單,我們首先需要儲存identifierusercount類屬性。由於它們是類級別的也不是例項變數,因此我們把他們宣告為靜態的:

@implementation

user

static nsuuid *_identifier = nil;

static

nsinteger _usercount = 0;

現在我們必須為這兩個屬性建立gettersetter方法。在正式版說明裡已經提到過,這些類屬性永遠不會被合成,所以如果 缺少gettersetter,xcode 將會報警告。第乙個唯讀的usercount僅需要乙個返回count 值的 getter 方法。 注意使用+使我們的getter 方法變成乙個類方法:

+ (nsinteger)usercount
identifier屬性則 getter方法 和 setter 方法都需要。在getter 方法中,如果identifier為空,我們就新建乙個identifier:

+ (nsuuid *)identifier 

return _identifier;

}+ (void)setidentifier:(nsuuid *)newidentifier

}

我們也為這個user類建立了乙個會更新 count 屬性的基本初始化方法。

- (instancetype)init

return

self;

}

resetidentifier類方法 是乙個能建立乙個新的identifier 的便利方法:

+ (void)resetidentifier 

@end

我們可以在類名後使用點語法來獲取到類屬性:

user.usercount

;user.identifier

;

這裡有乙個關於user類用法的例子:

for (int i = 0; i < 3; i++) 

[user resetidentifier];

nslog(@"identifier = %@",user.identifier);

這是輸出:

// user count: 1

// identifier = 4b98b7fd-f8dc-484a-92b2-b2bb20bcb709

// user count: 2

// identifier = 4b98b7fd-f8dc-484a-92b2-b2bb20bcb709

// user count: 3

// identifier = 4b98b7fd-f8dc-484a-92b2-b2bb20bcb709

// identifier = a0519681-1e08-4df2-b2d1-d077cf2bdeff

注意

儘管這是xcode 8 中 llvm 編譯器的新特性,但是它對於ios 10之前的版本依然適用。

似乎,objective-c 最近的這些改進只是為了提高與swift的互操作性。objective-c中新新增的型別屬性對應的是swift中類變數的用法。下面這是我們user類轉換為 swift 後的樣子:

public

class user : nsobject

public

class

var identifier: uuid!

public

class func resetidentifier()

}

注意,identifier 類屬性是乙個會隱式解包的變數,意味著我們永遠也不希望它為nil。為了允許它為nil,我們需要在objective-c的屬性宣告裡新增乙個nullable的標識。 我們的swift 變數也將會是可選型別的。看 using nullable to annotate objective-c可以看到更多詳細內容。

譯 Python中的類屬性與例項屬性的區別

以下的區別有意義麼?class a object foo 5 some default valuevs class b object def init self,foo 5 self.foo foo如果你需要建立很多例項,這兩種風格在表現和空間要求上有什麼區別麼?當你閱讀 的時候,你是否會考慮這兩種...

python 類屬性 用處 Python類屬性詳解

類屬性1.類定義後就存在,而且不需要例項化 2.類屬性使得相同類的不同例項共同持有相同變數 類屬性例項 attrb.py class testcss cssa class attribe def init self self.a 0 self.b 10 def info self print a s...

類屬性 例項屬性

例項屬性 物件屬性 顧名思義,類屬性就是類物件所擁有的屬性,它被所有類物件的例項物件所共有,在記憶體中只存在乙個副本,這個和c 中類的靜態成員變數有點類似。對於公有的類屬性,在類外可以通過類物件和例項物件訪問 例項如下 class people object name tom 公有的類屬性 age ...