Writing a Custom Class
創(chuàng)新互聯(lián)專注于企業(yè)全網(wǎng)營銷推廣、網(wǎng)站重做改版、濟(jì)源網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、html5、購物商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為濟(jì)源等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
編寫一個(gè)自定義類
當(dāng)你開發(fā)iOS app時(shí),你將發(fā)現(xiàn)很多情況都需要你寫自己的自定義類。當(dāng)你需要將包含數(shù)據(jù)的自定義行為進(jìn)行封裝的時(shí)候,自定義類會(huì)非常有用。在自定義類里,你能定義你自己的行為來存儲(chǔ)、手動(dòng)操作、和現(xiàn)實(shí)你的數(shù)據(jù)。
例如,考慮iOS 時(shí)鐘 app的世界時(shí)鐘選項(xiàng)卡。這個(gè)在表示圖中的表單元需要現(xiàn)實(shí)比基本表視圖單元更多的內(nèi)容。這是一個(gè)很好的機(jī)會(huì)來實(shí)現(xiàn)子類,這個(gè)子類擴(kuò)展了UITableViewCell的行為,讓你現(xiàn)實(shí)讓表視圖單元顯示更多的自定義數(shù)據(jù)。如果你正在設(shè)計(jì)這個(gè)自定義類,你或許會(huì)為添加outlets,以便添加在表單元中顯示時(shí)鐘信息的標(biāo)簽視圖和顯示自定義時(shí)鐘的圖片視圖。
這章教你你需要知道的關(guān)于Objective-C的語法和未完成實(shí)現(xiàn)ToDoList的類結(jié)構(gòu)。它討論XYZToDoItem的設(shè)計(jì),這個(gè)自定義類將代表你to-do list上的一個(gè)單一項(xiàng)。在第三個(gè)教程中,你將真正的實(shí)現(xiàn)這個(gè)類并添加它到你的app。
Declaring and Implementing a Class
聲明和實(shí)現(xiàn)一個(gè)類
Objective-C類的規(guī)范要求要有兩個(gè)不同的部分:接口和實(shí)現(xiàn)。接口準(zhǔn)確的指定什么類型的對象要在其他對象中被使用。換句話說,他指定了一個(gè)本類的對象和外部世界的一個(gè)公共接口。實(shí)現(xiàn)部分包括了在接口文件中聲明的方法的實(shí)現(xiàn)代碼。
一個(gè)對象應(yīng)該被設(shè)計(jì)成需要隱藏它內(nèi)部實(shí)現(xiàn)的細(xì)節(jié)。在Objective-C里,接口和實(shí)現(xiàn)通常放置在單獨(dú)的文件中,而你只需要使用公共接口。與C代碼一樣,你定義頭文件和源代碼文件到單獨(dú)的公開聲明,從實(shí)現(xiàn)你的代碼的細(xì)節(jié)。接口文件有.h擴(kuò)展名,實(shí)現(xiàn)文件有.m擴(kuò)展名。(你將在Tutorial: Add Data中為XYZToDoItem類實(shí)際創(chuàng)建這些文件。現(xiàn)在,只需要跟隨所有的介紹。)
Interface
接口
Objective-C語法使用聲明和類接口,看上去如下所示:
.@interfaceXYZToDoItem :NSObject
.
.
.
.@end
.
本例聲明了一個(gè)名為XYZToDoItem的類,它繼承自NSObject。
公共屬性和行為是定義在interface聲明里的。在這個(gè)例子中,沒有指定超類,所以唯一行為是XYZToDoItem繼承了NSObject。所有的對象需要一個(gè)最小的行為,所以在默認(rèn)下,他們必須繼承NSObject(或一個(gè)它的子類)。
Implementation
實(shí)現(xiàn)
Objective-C的語法用于聲明一個(gè)類實(shí)現(xiàn),如下所示:
.#import "XYZToDoItem.h"
.
.
.
.@implementationXYZToDoItem
.
.
.
.@end
.
如果你在類接口中聲明了任何方法,你需要在這個(gè)文件中實(shí)現(xiàn)它們。
Properties Store an Object’s Data
屬性存儲(chǔ)一個(gè)對象的數(shù)據(jù)
考慮什么信息是to-do item需要有的。你或許需要知道它的名字,當(dāng)它被創(chuàng)建的時(shí)候,還有是否它已經(jīng)完成。在你自定義的XYZToDoItem類中,你將存儲(chǔ)這些信息到屬性。
這些屬性的聲明存在于接口文件中(XYZToDoItem.h)。如下所示:
.@interfaceXYZToDoItem :NSObject
.
.
.
.@propertyNSString*itemName;
.
.@propertyBOOLcompleted;
.
.@propertyNSDate*creationDate;
.
.
.
.@end
.
在這個(gè)例子中,XYZToDoItem類聲明了三個(gè)公共屬性。這些屬性都是完全公開訪問的。使用公共訪問,其他對象能夠讀取和改變這些屬性的值。
你或許決定聲明這些屬性不能被改變(也就是說,它是只讀的)。指明是否一個(gè)屬性是規(guī)定為只讀——其他事情——Objective-C屬性聲明包含屬性的屬性( property attributes)。舉個(gè)例子,如果你不想XYZToDoItem中的創(chuàng)建日期被改變,你應(yīng)該更新XYZToDoItem類的接口文件如下所示:
.@interfaceXYZToDoItem :NSObject
.
.
.
.@propertyNSString*itemName;
.
.@propertyBOOLcompleted;
.
.@property(readonly)NSDate*creationDate;
.
.
.
.@end
.
屬性可以是私有的或者公有的。有時(shí)候建立一個(gè)私有的屬性讓其他類不能看到和訪問它是有意義的。舉個(gè)例子,如果你想讓追蹤一個(gè)屬性,這個(gè)屬性代表項(xiàng)的日期,它在被完成的時(shí)候標(biāo)記,而不讓其他類訪問這個(gè)信息,通過把它放置在你的實(shí)現(xiàn)文件(XYZToDoItem.m)頂部的類擴(kuò)展(class extension)中。
.#import "XYZToDoItem.h"
.
.
.
.@interfaceXYZToDoItem()
.
.@propertyNSDate*completionDate;
.
.@end
.
.
.
.@implementationXYZToDoItem
.
.
.
.@end
.
你使用getters和setters方法來訪問屬性。一個(gè)getter方法返回一個(gè)屬性的值,一個(gè)setter方法改變這個(gè)值。通常用點(diǎn)符號(hào)(dot notation)語法來訪問getter和setter方法。對于讀和寫來訪問屬性,你可以使用點(diǎn)符號(hào)來操作屬性的值。如果你有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
用方法定義對象行為
用方法定義對象能做什么。方法是一段代碼,它是你定義的執(zhí)行一個(gè)任務(wù)或類的子程序。方法訪問存儲(chǔ)在類中的數(shù)據(jù)并能使用這些信息來執(zhí)行某種操作。
舉個(gè)例子,給to-do item (XYZToDoItem) 一個(gè)能力是來給完成的項(xiàng)做標(biāo)記,你能在類接口文件中添加markAsCompleted方法。之后,你將在類的實(shí)現(xiàn)文件中實(shí)現(xiàn)這個(gè)方法的行為,具體的描述見Implementing Methods。
.@interfaceXYZToDoItem :NSObject
.
.
.
.@propertyNSString*itemName;
.
.@propertyBOOLcompleted;
.
.@property(readonly)NSDate*creationDate;
.
.-(void)markAsCompleted;
.
.
.
.@end
.
在方法名之前的 符號(hào)(-)表明這是一個(gè)對象方法,它能被該類的對象調(diào)用。這個(gè)減號(hào)有別于類方法,類方法用加號(hào)(+)表示。類方法能被該類自身調(diào)用。類工廠方法是類方法常見的例子,在Working with Foundation中你已經(jīng)學(xué)過它了。你也能使用類方法來訪問一些類共享的相關(guān)信息。
關(guān)鍵字通常被放在聲明開始前的圓括號(hào)里,表明這個(gè)方法沒有返回值。markAsCompleted方法接收參數(shù)。在Method Parameters中將討論更多參數(shù)的細(xì)節(jié)。
Method Parameters
方法參數(shù)
你申明帶參數(shù)的方法用來在你調(diào)用方法的時(shí)候傳遞一些信息。
舉個(gè)例子,你可以修改前面的方法代碼片段markAsCompleted來接受一個(gè)參數(shù),這個(gè)參數(shù)將判斷項(xiàng)目是否已經(jīng)標(biāo)記為完成或未完成。通過這種方式,你能切換項(xiàng)目的完成狀態(tài),而不是只用來對它設(shè)置完成。
.@interfaceXYZToDoItem :NSObject
.
.
.
.@propertyNSString*itemName;
.
.@propertyBOOLcompleted;
.
.@property(readonly)NSDate*creationDate;
.
.-(void)markAsCompleted:(BOOL)isComplete;
.
.
.
.@end
.
現(xiàn)在,你的方法接收了一個(gè)參數(shù),isComplete,它的類型是BOOL。
當(dāng)你涉及到帶參數(shù)名的方法時(shí),你需要包含方法名字的一部分,所以現(xiàn)在這個(gè)方法的名字更新為markAsCompleted。如果一個(gè)方法擁有多個(gè)參數(shù),這個(gè)方法的名字是由參數(shù)名隔開的。如果你想添加另一個(gè)參數(shù)到這個(gè)方法,它的申明看上去如下所示:
.-(void)markAsCompleted:(BOOL)isCompleteonDate:(NSDate*)date;
.
在這里,方法名字是寫成。isComplete和date被用在實(shí)現(xiàn)訪問相應(yīng)的值,這些值在方法被調(diào)用的時(shí)候被提供,就像變量一樣。
Implementing Methods
實(shí)現(xiàn)方法
方法實(shí)現(xiàn)使用花括號(hào)來包含相關(guān)的代碼。方法的名字必須對與接口文件中對應(yīng)的名字相同,而且參數(shù)和返回類型必須完全匹配。
這兒有一個(gè)你在XYZToDoItem類接口中添加的markAsCompleted方法簡單的實(shí)現(xiàn):
.@implementationXYZToDoItem
.
.-(void)markAsCompleted:(BOOL)isComplete{
.
.self.completed=isComplete;
.
.}
.
.@end
.
就像屬性一樣,方法可以分為私有和公有。公有方法在公有接口中申明,所以可以被其他對象調(diào)用。它們相應(yīng)的實(shí)現(xiàn)放置在實(shí)現(xiàn)文件中,不能被其他對象看見。私有方法只是在類中實(shí)現(xiàn),這就意味著他們只能在類中被調(diào)用實(shí)現(xiàn)。這是一個(gè)強(qiáng)有力的機(jī)制,用來為類添加內(nèi)部行為,且不能夠被其他對象訪問。
例如,你若想保持一個(gè)to-do 項(xiàng)的completionDate更新,如果to-do項(xiàng)標(biāo)記為完成,設(shè)置completionDate為當(dāng)前的日期。如果得到未完成標(biāo)記,設(shè)置completionDate為nil,因?yàn)樗€沒有完成。因?yàn)楦聇o-do項(xiàng)的completionDate是它自己獨(dú)立的任務(wù),最好方法是為自己寫方法。然而,重要的是它確保其他對象不能調(diào)用這個(gè)方法——否則,其他對象能夠在任何時(shí)候設(shè)置to-do 項(xiàng)的completionDate。因?yàn)檫@個(gè)原因,你要把這個(gè)方法設(shè)為私有。
現(xiàn)在,來更新XYZToDoItem的實(shí)現(xiàn)方法,用來包括私有方法setCompletionDate,它在markAsCompleted中被調(diào)用,來更新to-do項(xiàng)的completionDate無論它被標(biāo)記為完成或者未完成。注意你不要在接口文件中添加任何東西,因?yàn)槟悴幌胱屍渌麑ο罂吹竭@些方法。
.@implementationXYZToDoItem
.
.-(void)markAsCompleted:(BOOL)isComplete{
.
.self.completed=isComplete;
.
.[selfsetCompletionDate];
.
.}
.
.-(void)setCompletionDate{
.
.if(self.completed){
.
.self.completionDate=[NSDatedate];
.
.}else{
.
.self.completionDate=nil;
.
.}
.
.}
.
.@end
.
現(xiàn)在,你已經(jīng)定義了一個(gè)基本的使用XYZToDoItem類的to-do list項(xiàng)的表示。XYZToDoItem存儲(chǔ)關(guān)于它自己的信息——名字、創(chuàng)建日期、完成狀態(tài)——以屬性的形式,并且它定義了它能做什么——對是否完成進(jìn)行標(biāo)記——使用方法。這是你在接下來的ToDoList教程中需要完成的程度。但是,你總是能嘗試通過添加你自己的屬性和方法到類來在app中集成新的行為。
Working with Foundation
Tutorial: Add Data
Copyright 2014 Apple Inc. All rights reserved. Terms of Use | Privacy Policy | Updated: 2013-10-22
網(wǎng)站欄目:YourFirstiOSapp(10)--WritingaCustomClass
文章地址:http://www.chinadenli.net/article16/pigogg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設(shè)計(jì)公司、電子商務(wù)、微信小程序、營銷型網(wǎng)站建設(shè)、網(wǎng)站改版、小程序開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)