Xcode C ++ und Objective-C Refactoring

8

Gibt es eine Möglichkeit, gemischten C ++ / Objective-C-Code in Xcode zu refobieren? Ich schreibe ein Spiel mit Cocos2D und Box2D, und die Box2D ist auf C ++ geschrieben, so dass jede Klasse, die ich schreibe, .mm Extension haben sollte und daher, wenn ich z. benenne die Variable um, ich erhielt eine Nachricht wie " Xcode kann nur C- und Objective-C-Code umgestalten ".

Vielen Dank im Voraus!

    
Terko 05.04.2013, 17:12
quelle

4 Antworten

10

Xcode ist SEHR begrenzt mit Refactoring, sogar mit einfachem Obj-C. Es ist im Grunde umbenennen und es kann nicht einmal in Kommentaren umbenennen. Wenn es sagt, dass es etwas nicht kann, dann kann es wahrscheinlich nicht.

Die einzige Möglichkeit zum Umbenennen ist die Verwendung von find & replace . Beachten Sie, dass Xcode reguläre Ausdrücke verarbeiten kann, so dass es oft gut genug ist.

Natürlich ist das Problem, dass find & amp; Ersetzen Sie nicht die Programmiersprache und manchmal kann einige zusätzliche ersetzen oder vergessen, etwas zu ersetzen, daher besonders vorsichtig sein. Ein sauberer Build ist nach jedem Refactoring notwendig, um zu überprüfen, ob alles korrekt umbenannt wurde.

Sie können auch Befehlszeilenprogramme verwenden (z. B. sed ), um dasselbe zu erreichen.

    
Sulthan 05.04.2013, 17:19
quelle
3

Ich hatte das gleiche Problem im cocos2d / box2d-Spiel, das ich gerade entwickle.

Fakt 1: Xcode 4 kann C- und Objective-C-Dateien (.m-Dateien) umgestalten, aber es kann keinen Objective-C ++ - Code (.mm-Dateien) umgestalten.

Fakt 2: Wenn Sie mit box2d (das in C ++ geschrieben ist) interagieren wollen, müssen Sie Objective-C ++ verwenden.

Ich habe (teilweise) das Problem mit den folgenden Schritten behoben:

  1. Ich habe ein paar Wrapper in Objective-C ++ für die box2d-Klassen erstellt, mit denen ich interagieren musste (zB MyWorld.mm ist ein Wrapper der c ++ - Klasse b2World und < em> MyBody.mm ist ein Wrapper für die C ++ - Klasse b2Body ). Hier ist es wichtig, keinen Verweis auf box2d in der .h der Wrapper zu vermeiden.
  2. In jeder anderen Klasse meines Projekts habe ich nie direkt auf die box2d-Klassen verwiesen, stattdessen habe ich die zugehörigen Wrapper genannt. Natürlich habe ich auch #import "Box2D.h" aus diesen Klassen entfernt.
  3. Ich habe jede andere Klasse meines Projekts in einfaches Objective-C (.m) konvertiert.

Das Ergebnis ist, dass Xcode jetzt jede Klasse meines Projekts umgestalten kann, aber natürlich die Wrapper.

P.S. Wenn Sie einen Wrapper (z. B. MyWorld) in Ihren Objective-C-Klassen verwenden müssen, müssen Sie natürlich MyWorld.h und nicht MyWorld.mm importieren.

    
Luca Angeletti 12.04.2013 23:55
quelle
2

Vielleicht möchten Sie dieses Projekt auf GitHub ausprobieren - es ist ein Work in Progress, aber immer noch:

Ссылка

Es ist ein C ++ - Refactoring-Tool, das auf Clang basiert (d. h. der Compiler Xcode selbst basiert auf).

    
cacau 08.01.2014 12:36
quelle
0

Ich hatte eine Art Lösung - um Objective-C und Objective-C ++ - Code zu trennen. Es gibt einige Makros, die erkennen lassen, ob die Datei in reinem Objective-C verwendet wird. Beispiel:

Ссылка

Die Idee ist, dass Sie .mm-Dateien immer noch nicht umgestalten können, aber Sie können den ganzen anderen Code umgestalten, selbst wenn er Objective-C ++ - Code enthält.

    
Vyachaslav Gerchicov 22.04.2015 08:21
quelle