2014-02-21 45 views
-2

如何在Xcode中編寫代碼,類似於Java或C++中的語法,特別是靜態或動態調用函數(消息)?我只想簡單地在類C語法中調用Objective-C函數。C語法中調用函數

如何當我寫NSString * s = NSString.alloc().init(); (或類似的,例如,NSString::alloc().init(),或NSString::alloc.init(new NSString()).alloc().init() ;)) 在Xcode(或其他iPhone開發環境),編譯器沒有造成錯誤,它將運行。

或類似代碼

NSString * a = NSString.alloc().init(); //or similar 

bool b = a.compare("abcdef"); //or bool b = a->compare("abcdef"); 

運行。

+7

這個問題沒有進一步解釋**你爲什麼要**。 –

+1

Objective-C不能以這種方式工作。您*可以*獲取並直接執行方法實現,但每次使用它時都必須執行它,因爲運行時可能會更改。如果你不喜歡Objective-C語法,我建議用另一種語言編程。如果你想按你喜歡的方式進行iOS開發和C#調用,Xamarin/Mono的功能相當不錯。 –

+0

我只是習慣java或c語法,並且希望看到這個語法 – WizardProgrammer

回答

0

沒有,有沒有辦法來調用不同的語法Objective-C的方法,但有一個例外:

你可以調用不帶參數的一個點符號,如object.method方法(這主要是用來具有屬性,這些屬性又是由編譯器生成的getter和setter方法)。

因此,在Objective-C中調用方法的方法([object method][object methodWithArgumentA:someValue argumentB:otherValue])無法更改。這是語言設計者選擇的語法。一旦你使用了它,你就會明白爲什麼:

Objective-C中的方法名稱往往是非常具有描述性的,並且像Objective-C命名參數一樣使用(技術上,情況並非如此)。如:

[someData writeToFile:aFileName atomically:YES]; 

你會如何將它轉換爲點符號?這可能是這樣的:

someData.writeToFileAtomically(aFileName, YES); 

現在,如果我看到一個方法只是writeToFileAtomically我不會感到驚訝,如果它只是將採取一個參數(是否原子寫入文件,但文件?)或無參數(只是原子地寫入文件;再次,哪個文件?)。使用Objective-C符號的意圖更加清晰。

現在考慮object.addObserverForKeyPathOptionsContext(o, k, op, c)[object addObserver:o forKeypath:k options:op context:c]

是否喜歡這種語法是主觀的。你似乎不喜歡它,因爲你不會問如​​何擺脫它。但是如果你想編寫Objective-C代碼,你必須接受這是它完成的方式,你不能改變它。擁抱它,起初我發現它很奇怪(也來自長期的C++和Java背景),但是現在我錯過了在使用其他語言工作時使用Objective-C參數調用方法的非常冗長的方式。

4

Objective-C具有C函數。實際上,所有有效的C代碼都是有效的Objective-C代碼。所以是的,你可以用C語法調用函數。

但是,對象和消息發送使用Objective-C對C語言的語法擴展,它們是不可配置的。他們是語言的一部分。您不能更改Objective-C的語法,而不能使C++使用Smalltalk語法。

+0

謝謝,我知道這種方式。我可以調用像CGRect()或類似的函數。但不是alloc和init)或者你說的目標函數。爲了編寫類似c的代碼,我嘗試在目標C++中編寫包裝類,但爲此我需要創建大量代碼)。 – WizardProgrammer