iT邦幫忙

0

iOS APP 開發 OC 第二十二天,Extension

  • 分享至 

  • xImage
  •  
tags: OC 30 day

延展: Extension

  1. 是一個特殊分類,所以延展也是類的一部分。
  2. extension 沒有名字
  3. 只有聲明,沒有實現。與本類共享一個實現。

Extension的語法

語法:
@interface 本類名()

@end

沒有實現。和本類共享一個實現。

為類添加Extension的步驟

只有一個.h文件。文件名稱:本類名_取得文件名.h。
這個文件中只有Extension的聲明。
@interface Person()

@end


新增一個OC文件,File Type點選 Extension。

Extension 的基本使用

  1. Extension 的本質是一個分類,作為本類的一部分。只不過是一個特殊的分類,沒有名字。
  2. 延展只有聲明,沒有單獨的實現,合本類共享一個實現。

Extension 與 class 的區別

  1. 分類有名字,Extension沒有名字,是一個匿名的分類。
  2. 每一個分類都有單獨的聲明和實現,而Extension只有聲明,沒有單獨的實現,和本類共享一個實現。
  3. 分類只能新增方法,而延展中任意成員都可以寫。
  4. 分類當中可以寫@property 但是只會生成 getter setter的聲明。Extension中寫@property 會自動生成私有屬性,也會生成getter setter的聲明實現。

Extension的應用場景

為類寫一個私有的 @property 。

生成的getter,setter方法只能在類的內部訪問,不能在外部訪問。
其實,我們可以想: @property生成私有屬性,生成getter setter的實現,不要聲明。

@implementation Person
{
    int _age;
}
- (void)setAge:(int)age
{
    _age = age;
}
- (int)age
{
    return _age;
}
@end

我們可以在 @implementation 裡面聲明一個變數,再賦予他getter與setter。但是這樣又回到了原點,我們想要利用 @property簡化getter與setter的流程。

那我們該怎麼做? Extension

@interface Person()

@property(nonatomic,assign)int age;

@end

@implementation Person
@end

這個操作有實現,會實現在哪裡呢? @implementation 。

Extension 在100%的情況下不會獨佔一個文件。都是將延展直接寫在本類的實現文件當中。這個時候,寫在延展中的成員,就相當於這個類的私有成員,只能在本類的實現中訪問,外部不能訪問。
如果想要為類寫一個私有屬性,雖然我們可以定義在@implementation之中,但是請不要這麼寫,這樣很不規範。寫一個Extension,定義在Extension當中。
也建議聲明寫在延展當中,實現寫在本類的實現當中。提供代碼的閱讀性。
如果想要為類寫一個私有的 @property 就直接寫在Extension就可以了。

Extension 天生就是私有化類的成員的

如果類的成員只希望在類的內部訪問,那麼就將其定義在延展中。
如果類的成員允許被外界訪問,定義在本類的interface之中。


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言