您好,登錄后才能下訂單哦!
Writing a Custom Class
編寫一個自定義類
當你開發iOS app時,你將發現很多情況都需要你寫自己的自定義類。當你需要將包含數據的自定義行為進行封裝的時候,自定義類會非常有用。在自定義類里,你能定義你自己的行為來存儲、手動操作、和現實你的數據。
例如,考慮iOS 時鐘 app的世界時鐘選項卡。這個在表示圖中的表單元需要現實比基本表視圖單元更多的內容。這是一個很好的機會來實現子類,這個子類擴展了UITableViewCell的行為,讓你現實讓表視圖單元顯示更多的自定義數據。如果你正在設計這個自定義類,你或許會為添加outlets,以便添加在表單元中顯示時鐘信息的標簽視圖和顯示自定義時鐘的圖片視圖。
這章教你你需要知道的關于Objective-C的語法和未完成實現ToDoList的類結構。它討論XYZToDoItem的設計,這個自定義類將代表你to-do list上的一個單一項。在第三個教程中,你將真正的實現這個類并添加它到你的app。
Declaring and Implementing a Class
聲明和實現一個類
Objective-C類的規范要求要有兩個不同的部分:接口和實現。接口準確的指定什么類型的對象要在其他對象中被使用。換句話說,他指定了一個本類的對象和外部世界的一個公共接口。實現部分包括了在接口文件中聲明的方法的實現代碼。
一個對象應該被設計成需要隱藏它內部實現的細節。在Objective-C里,接口和實現通常放置在單獨的文件中,而你只需要使用公共接口。與C代碼一樣,你定義頭文件和源代碼文件到單獨的公開聲明,從實現你的代碼的細節。接口文件有.h擴展名,實現文件有.m擴展名。(你將在Tutorial: Add Data中為XYZToDoItem類實際創建這些文件。現在,只需要跟隨所有的介紹。)
Interface
接口
Objective-C語法使用聲明和類接口,看上去如下所示:
.@interfaceXYZToDoItem : NSObject
.
.
.
.@end
.
本例聲明了一個名為XYZToDoItem的類,它繼承自NSObject。
公共屬性和行為是定義在interface聲明里的。在這個例子中,沒有指定超類,所以唯一行為是XYZToDoItem繼承了NSObject。所有的對象需要一個最小的行為,所以在默認下,他們必須繼承NSObject(或一個它的子類)。
Implementation
實現
Objective-C的語法用于聲明一個類實現,如下所示:
.#import "XYZToDoItem.h"
.
.
.
.@implementationXYZToDoItem
.
.
.
.@end
.
如果你在類接口中聲明了任何方法,你需要在這個文件中實現它們。
Properties Store an Object’s Data
屬性存儲一個對象的數據
考慮什么信息是to-do item需要有的。你或許需要知道它的名字,當它被創建的時候,還有是否它已經完成。在你自定義的XYZToDoItem類中,你將存儲這些信息到屬性。
這些屬性的聲明存在于接口文件中(XYZToDoItem.h)。如下所示:
.@interfaceXYZToDoItem : NSObject
.
.
.
.@propertyNSString*itemName;
.
.@propertyBOOLcompleted;
.
.@propertyNSDate*creationDate;
.
.
.
.@end
.
在這個例子中,XYZToDoItem類聲明了三個公共屬性。這些屬性都是完全公開訪問的。使用公共訪問,其他對象能夠讀取和改變這些屬性的值。
你或許決定聲明這些屬性不能被改變(也就是說,它是只讀的)。指明是否一個屬性是規定為只讀——其他事情——Objective-C屬性聲明包含屬性的屬性( property attributes)。舉個例子,如果你不想XYZToDoItem中的創建日期被改變,你應該更新XYZToDoItem類的接口文件如下所示:
.@interfaceXYZToDoItem : NSObject
.
.
.
.@propertyNSString*itemName;
.
.@propertyBOOLcompleted;
.
.@property(readonly)NSDate*creationDate;
.
.
.
.@end
.
屬性可以是私有的或者公有的。有時候建立一個私有的屬性讓其他類不能看到和訪問它是有意義的。舉個例子,如果你想讓追蹤一個屬性,這個屬性代表項的日期,它在被完成的時候標記,而不讓其他類訪問這個信息,通過把它放置在你的實現文件(XYZToDoItem.m)頂部的類擴展(class extension)中。
.#import "XYZToDoItem.h"
.
.
.
.@interfaceXYZToDoItem()
.
.@propertyNSDate*completionDate;
.
.@end
.
.
.
.@implementationXYZToDoItem
.
.
.
.@end
.
你使用getters和setters方法來訪問屬性。一個getter方法返回一個屬性的值,一個setter方法改變這個值。通常用點符號(dot notation)語法來訪問getter和setter方法。對于讀和寫來訪問屬性,你可以使用點符號來操作屬性的值。如果你有XYZToDoItem類的toDoItem對象,你可以用下面的方法操作:
.toDoItem.itemName=@"Buy milk";//Sets the value of itemName
.
.NSString*selectedItemName=toDoItem.itemName;//Gets the value of itemName
.
Methods Define an Object’s Behavior
用方法定義對象行為
用方法定義對象能做什么。方法是一段代碼,它是你定義的執行一個任務或類的子程序。方法訪問存儲在類中的數據并能使用這些信息來執行某種操作。
舉個例子,給to-do item (XYZToDoItem) 一個能力是來給完成的項做標記,你能在類接口文件中添加markAsCompleted方法。之后,你將在類的實現文件中實現這個方法的行為,具體的描述見Implementing Methods。
.@interfaceXYZToDoItem : NSObject
.
.
.
.@propertyNSString*itemName;
.
.@propertyBOOLcompleted;
.
.@property(readonly)NSDate*creationDate;
.
.-(void)markAsCompleted;
.
.
.
.@end
.
在方法名之前的 符號(-)表明這是一個對象方法,它能被該類的對象調用。這個減號有別于類方法,類方法用加號(+)表示。類方法能被該類自身調用。類工廠方法是類方法常見的例子,在Working with Foundation中你已經學過它了。你也能使用類方法來訪問一些類共享的相關信息。
關鍵字通常被放在聲明開始前的圓括號里,表明這個方法沒有返回值。markAsCompleted方法接收參數。在Method Parameters中將討論更多參數的細節。
Method Parameters
方法參數
你申明帶參數的方法用來在你調用方法的時候傳遞一些信息。
舉個例子,你可以修改前面的方法代碼片段markAsCompleted來接受一個參數,這個參數將判斷項目是否已經標記為完成或未完成。通過這種方式,你能切換項目的完成狀態,而不是只用來對它設置完成。
.@interfaceXYZToDoItem : NSObject
.
.
.
.@propertyNSString*itemName;
.
.@propertyBOOLcompleted;
.
.@property(readonly)NSDate*creationDate;
.
.-(void)markAsCompleted:(BOOL)isComplete;
.
.
.
.@end
.
現在,你的方法接收了一個參數,isComplete,它的類型是BOOL。
當你涉及到帶參數名的方法時,你需要包含方法名字的一部分,所以現在這個方法的名字更新為markAsCompleted。如果一個方法擁有多個參數,這個方法的名字是由參數名隔開的。如果你想添加另一個參數到這個方法,它的申明看上去如下所示:
.-(void)markAsCompleted:(BOOL)isCompleteonDate:(NSDate*)date;
.
在這里,方法名字是寫成。isComplete和date被用在實現訪問相應的值,這些值在方法被調用的時候被提供,就像變量一樣。
Implementing Methods
實現方法
方法實現使用花括號來包含相關的代碼。方法的名字必須對與接口文件中對應的名字相同,而且參數和返回類型必須完全匹配。
這兒有一個你在XYZToDoItem類接口中添加的markAsCompleted方法簡單的實現:
.@implementationXYZToDoItem
.
.-(void)markAsCompleted:(BOOL)isComplete{
.
.self.completed=isComplete;
.
.}
.
.@end
.
就像屬性一樣,方法可以分為私有和公有。公有方法在公有接口中申明,所以可以被其他對象調用。它們相應的實現放置在實現文件中,不能被其他對象看見。私有方法只是在類中實現,這就意味著他們只能在類中被調用實現。這是一個強有力的機制,用來為類添加內部行為,且不能夠被其他對象訪問。
例如,你若想保持一個to-do 項的completionDate更新,如果to-do項標記為完成,設置completionDate為當前的日期。如果得到未完成標記,設置completionDate為nil,因為它還沒有完成。因為更新to-do項的completionDate是它自己獨立的任務,最好方法是為自己寫方法。然而,重要的是它確保其他對象不能調用這個方法——否則,其他對象能夠在任何時候設置to-do 項的completionDate。因為這個原因,你要把這個方法設為私有。
現在,來更新XYZToDoItem的實現方法,用來包括私有方法setCompletionDate,它在markAsCompleted中被調用,來更新to-do項的completionDate無論它被標記為完成或者未完成。注意你不要在接口文件中添加任何東西,因為你不想讓其他對象看到這些方法。
.@implementationXYZToDoItem
.
.-(void)markAsCompleted:(BOOL)isComplete{
.
.self.completed=isComplete;
.
.[selfsetCompletionDate];
.
.}
.
.-(void)setCompletionDate{
.
.if(self.completed){
.
.self.completionDate=[NSDatedate];
.
.}else{
.
.self.completionDate=nil;
.
.}
.
.}
.
.@end
.
現在,你已經定義了一個基本的使用XYZToDoItem類的to-do list項的表示。XYZToDoItem存儲關于它自己的信息——名字、創建日期、完成狀態——以屬性的形式,并且它定義了它能做什么——對是否完成進行標記——使用方法。這是你在接下來的ToDoList教程中需要完成的程度。但是,你總是能嘗試通過添加你自己的屬性和方法到類來在app中集成新的行為。
Working with Foundation
Tutorial: Add Data
Copyright 2014 Apple Inc. All rights reserved. Terms of Use | Privacy Policy | Updated: 2013-10-22
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。