2015-04-01 74 views
1

我目前正在重構一些Objective-C代碼以刪除顯式獲取者和設置者。在目標C中重構顯式獲取者和設置者C

所以這樣的:

[instance member] 
[instance setMember:value] 

應該成爲這樣的:

instance.member 
instance.member = value 

目前正在爲這一個正則表達式,但如果這已經解決了,我會很感激考慮別人的優點工作。

+0

爲什麼?這對你來說是非常重要的風格嗎? – Wain 2015-04-01 18:35:10

+0

它比必要的更冗長。它是一個樣本代碼,可以在內部和外部無處不在複製/粘貼。 – escapecharacter 2015-04-01 18:36:10

+0

編譯器具有這樣的信息,因爲當有人使用點語法時,它會做相反的處理;同樣你也必須解析一般情況下的屬性聲明,因爲訪問器可以被重命名。 – 2015-04-01 18:44:22

回答

3

要讓所有[instance setMember:value];調用轉換爲instance.member = value;,使用Xcode的重構:編輯>重構>轉換成現代的Objective-C語法。如果適用,它還會將獲取者轉換爲variable = [instance member];調用variable = instance.member;語法。

我可能會誤解你的意圖,但我想指出的是,使用instance.member;是不良作風如果你不值賦值給一個變量。如果您因爲副作用而調用方法,請使用[instance method];來代替,以使意圖更清晰。僅使用點語法來實際讀取和寫入屬性以避免混淆。

的Xcode 6.3居然警告你,如果你有一個方法/屬性,該屬性返回一個值,你調用,吸氣,而不將其分配給一個變量(如viewController.view;[viewController view];),因爲它是假設這個呼叫是錯誤。爲了擺脫所得到的警告,你需要明確地告訴編譯器,你正在做的副作用(例如,以確保XIB被加載)通過鑄造到void,如(void)[viewController view];

若要轉換某些setter重構錯過,您可能需要手動轉換這些,恐怕。要找到它們,請轉至查找導航器(Cmd-3),選擇查找>正則表達式。使用正則表達式\[\[\w+\s+\w+\]\s+set(不幸的是,不能簡單地使用正則表達式轉換這些調用,因爲您需要轉換一個字符:[foo setBar:123]需要轉換爲foo.bar = 123,這意味着B需要轉爲小寫b )。您可以爲上下文菜單編寫一項服務,以進行必要的轉換(請參閱top answer to "Sort Lines in Selection" for Xcode 4關於如何編寫服務等)以加快該手動任務的速度。

+0

正在調查。在預加載viewController時,關於'(void)'的註釋已經解決了警告。 – escapecharacter 2015-04-01 19:31:45

+0

嗯...... *轉換爲現代Objective-C語法*抓住了一些東西,但沒有抓住我想要的一切。它傳遞了諸如'[[self collider] setHidden:YES]';' – escapecharacter 2015-04-01 20:24:33

+0

無賴。我已經更新了我對這個問題的建議。 – DarkDust 2015-04-02 07:31:03