iT邦幫忙

0

iOS App開發 OC 第一天, @interface設計思維

從Swift 到 OC 第一天, @interface設計思維

tags: OC 30 day

第一次打開 objc 的文件,看到了一個關鍵字 @interface

究竟什麼是interface ?

先看看wiki怎麼說吧:
interface :
定義部分,清楚定義了類的名稱、成員變數和方法。 以關鍵字@interface作為開始,@end作為結束。

[color=#d2ed28] In object-oriented programming, a protocol or interface is a common means for unrelated objects to communicate with each other. These are definitions of methods and values which the objects agree upon in order to cooperate.
接口約定了對象間交互的屬性和方法,使得對象間無需了解對方就可以協作。

interface 是否就是我們在C++ 裏看到的 class ?

Objective-C中強制要求將類的定義(interface)與實現(implementation)分為兩個部分。
類的定義檔案遵循C語言之慣例以.h為字尾,實現檔案以.m為字尾。
這也就是為什麼我們在Objc裡看到.h .m 的文件。

對比@interface和@implementation
@interface 我們干過的事:
1、繼承
2、聲明協議
3、定義實例變量(@interface後面加大括號那種)
4、定義@property
5、聲明方法
@implementation 我們干過的和可以幹的事:
1、繼承
2、定義實例變量
3、合成屬性(@synthesize和@dynamic)
4、實現方法(包括協議方法)

interface 與 implementation 的簡要關係

interface

定義部分,清楚定義了類的名稱、成員變數和方法。 以關鍵字@interface作為開始,@end作為結束。

@interface MyObject : NSObject {
    int memberVar1; // 实体变量
    id  memberVar2;
}

+(return_type) class_method; // 类方法

-(return_type) instance_method1; // 实例方法
-(return_type) instance_method2: (int) p1;
-(return_type) instance_method3: (int) p1 andPar: (int) p2;
@end

方法前面的 +/- 號代表函式的類型:加號(+)代表類別方法(class method),不需要實例就可以呼叫,與C++ 的靜態函式(static member function)相似。減號(-)即是一般的實例方法(instance method)。

implementation

實現區段則包含了公開方法的實現,以及定義私有(private)變數及方法。 以關鍵字@implementation作為區段起頭,@end結尾。

@implementation MyObject {
  int memberVar3; //私有實體變數
}

+(return_type) class_method {
    .... //method implementation
}
-(return_type) instance_method1 {
     ....
}
-(return_type) instance_method2: (int) p1 {
    ....
}
-(return_type) instance_method3: (int) p1 andPar: (int) p2 {
    ....
}
@end

值得一提的是不只Interface區段可定義實體變數,Implementation區段也可以定義實體變數,兩者的差別在於存取權限的不同,Interface區段內的實體變數默認權限為protected,宣告於implementation區段的實體變數則默認為private,故在Implementation區段定義私有成員更符合物件導向之封裝原則,因為如此類別之私有資訊就不需曝露於公開interface(.h檔案)中。

interface 就是為了給調用者看的

是和調用者的一個protocol,沒錯,就是protocol。

interface 的正確姿勢

看過不少代碼,從@interface設計上多少就能看出作者的水平,分享下我對於這個問題的一些拙見。

只暴露外部需要看到的

// Sark.h 
@interface SarkViewController : NSObject <NSXMLParserDelegate /*1*/, NSCopying> { 
    NSString *_name; // 2 
    IBOutlet UITextField *_nameTextField; // 2 
} 
@property (nonatomic, strong) NSXMLParser *parser; // 3 
- (IBAction)nameChangedAction:(id)sender; // 4 
@end  

個interface出現的問題:

  1. 類內部自己使用的協議,如不應該在頭文件@interface中聲明,而應該在類擴展中聲明;公開由外部調用的協議,如則寫在這兒是正確的。
  2. 實例變量和IBOutlet不應出現在這兒定義,這將類的內部實現暴露了出去,自從屬性可以自動合成後,這裡就更應該清凈了。
  3. 內部使用的屬性對象不要暴露在外,應該移動到類擴展中。
  4. 調用者對IBAction同樣不需要關心,那麼就不應該放在這兒。

原文網址:https://kknews.cc/culture/n5zr2x3.html

總結

  1. interface 是一個接口,主要是讓調用者看的。
  2. implementation 裡的變數是 private ,是物件導向裡的封裝原則。

尚未有邦友留言

立即登入留言