翻譯自: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型別。要注意有屬性宣告的類。
實現也很簡單,我們首先需要儲存identifier
和usercount
類屬性。由於它們是類級別的也不是例項變數,因此我們把他們宣告為靜態的:
@implementation
user
static nsuuid *_identifier = nil;
static
nsinteger _usercount = 0;
現在我們必須為這兩個屬性建立getter
和setter
方法。在正式版說明裡已經提到過,這些類屬性永遠不會被合成,所以如果 缺少getter
或setter
,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
注意似乎,objective-c 最近的這些改進只是為了提高與swift的互操作性。objective-c中新新增的型別屬性對應的是swift中類變數的用法。下面這是我們儘管這是xcode 8 中 llvm 編譯器的新特性,但是它對於ios 10之前的版本依然適用。
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 ...