簡體   English   中英

對Objective-c代碼感到沮喪

[英]Frustrated with Objective-c code

好吧,我已經開始使用Head First iPhone Development(O'reilly)進行iPod / iPhone編程,並且正在從書中鍵入代碼。 有兩個問題,一個與編程有關,另一個與編程無關。

  • 我不了解Objective-C方法的格式。 根據這本書的源代碼,我現在遇到一些錯誤。 這導致我下一個問題。

  • 一些代碼是錯誤的。 我認為是這樣,因為如果不修改它就無法運行代碼。 由於這是第一版,因此本書中有一些錯字,但我的“修正”代碼可能與此有關嗎?

那么... 我在哪里可以了解有關Objective-C方法的更多信息,以及它們如何在結構上起作用以及返回類型和參數在哪里?

對於那些擁有本書的人,我在開始時就處於InstaTweet應用程序的中間位置。

謝謝。

也許將“類似於c”的語言與obj-c進行比較會很有用-讓我們開始使用Java。 想象一下帶有setBackgroundColor方法的Rectangle類。 我們假設我們有一個名為rect的Rectangle實例。

在Java中,方法簽名可能是

public void setBackgroundColor(int r, int g, int b) { ... }

在Objective-C中,參數是方法簽名的一部分,因此它可能是

- (void)setBackgroundColorWithRed:(int)r green:(int)g blue:(int)b;

“-”表示它是Rectangle類的實例方法。 (void)是方法的返回類型。 然后來論證。 每個冒號定義一個參數,該參數被鍵入(在此示例中,每個arg為(int))。

讓我們比較調用這些方法。 Java:

rect.setBackgroundColor(255, 255, 0);

對象:

[rect setBackgroundColorWithRed:255 green:255 blue:0];

很多人迷戀obj-c的語法-您並不孤單。 希望這種比較可以使事情變得更清楚。 它還體現了Objective-C的語言優勢:在通話時,您的論點很清楚。 如果我正在閱讀代碼,並且看到Java方法被調用,則參數是紅色,藍色和綠色並不是很明顯。 令人費解的是,在obj-c中,我們正在設置各個顏色值。 當然,大多數開發人員都可以猜測setColor方法的三個參數是什么,但是更復雜的方法會造成混淆。 這是用Java和Objective-c定義的更復雜的方法:

static Dog createDog(  String name
                     , int age
                     , boolean isNeutered
                     , String ownerName
                    );
+ (Dog *)createDogNamed:(NSString *)name 
     age:     (int)        age 
     neutered:(BOOL)       isNeutered 
     owner:   (NSString *) owner;

通話時:

Dog.createDog("Fluffy", 2, true, "Moshe");
[Dog createDogNamed:@"Fluffy" age:2 neutered:YES owner:@"Moshe"];

Objective-c較為冗長,但可讀性更高。 在Java示例中,還不清楚“ 2”和“ true”自變量的含義。 Objective-c的讀法幾乎像英語。

其他人已經發布了指向更深入指南的鏈接,但是我希望這可以使您擺脫語法絆腳石,足以使這些鏈接有用。 我很高興回答您的更多具體問題。 以我的經驗,obj-c新手在語法方面非常艱難,然后單擊 s並感覺很棒。 掛在那里!

查看Apple 關於Objective C介紹

基本方法格式為

-(ReturnType *)methodName:(VariableType *)variableName{

}

例如:

-(NSString *)giveMeANewStringFromAnOldString:(NSString *)oldString{

}

您還應該檢查書籍的勘誤表。

Objective-C方法的定義非常簡單。 實際上,它與常規C函數調用定義非常相似。 最大的補充是可以為參數命名。 這是一個例子:

-(int)addX:(int)x toY:(int)y
{
    return x + y;
}

您可以通過向適當的對象發送消息來使用:

int z = [object addX:x toY:y];

在這種情況下,我為參數和參數指定了相同的名稱,以使事情變得清晰起來。 您可以輕松地做到:

int z = [object addX:4 toY:7];

之后, z將為11。

我做了你做的同樣的事情。 我也拿起了《 Head First iPhone Development》一書(包含3.1 SDK)。

我瀏覽了其中的所有教程,發現只有一個錯誤導致我的應用程序無法正常工作(我在書中記下了它,但現在找不到了...)。

因此,在那之后,我意識到我在語法上遇到了完全相同的問題。

我選擇了Stephen G. Kochan撰寫的“在Objective-C 2.0中編程”。 (簡直太棒了。)這本書簡明扼要。 我什至沒有讀完本書的25%,我的所有問題都得到了回答。

讀目標C代碼讓我花了幾個月的時間,因為我已經習慣了不同的語法,以至於我的大腦花了一些時間來適應目標C的期望。

我發現,一旦您動腦筋,Objective-C代碼就會變得真正可讀。 上面的Carl Norum的例子很好地展示了可讀性。

[object addX:4 toY:7];

沒有比這更具可讀性的了!

另外,某些術語也有所不同。 “向對象發送消息”與“調用方法”也讓我呆了幾個星期。

我希望這本書的建議對您有幫助,對我有很多幫助。

Apple提供了一些很棒的學習資源:

學習Objective-C:入門

可可編碼准則

祝好運!

閱讀Mac®OS X(第3版)的Cocoa(R)編程 ,這是Mac和Cocoa的聖經。

我沒有任何問題,但請記住,API一直在向前發展,因此可能會有一些微小的更新/更改。 但是我還沒有發現任何阻礙我完成所有代碼示例和練習的東西。

這是本書。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM