Frage Gibt es ein Objective-C, das dem Schlüsselwort "var" von C # entspricht?


Großer Befürworter der Verwendung des Schlüsselworts 'var' in C # für Fälle, in denen es sehr klar ist. Zum Beispiel, anstatt dies ...

ThisIsMyReallyLongFooClassName foo = new ThisIsMyReallyLongFooClassName();

Ich kann das tippen ...

var foo = new ThisIsMyReallyLongFooClassName();

... und ich habe immer noch eine stark typisierte Variable. Die beiden sind in jeder Hinsicht gleich. Letzteres ist nur lesbarer (wieder, weil es klar ist. Es gibt Fälle, wo es nicht ist und "var" sollte nicht verwendet werden. Ich will nicht, dass dies eine Diskussion darüber wird.)

Ich frage mich, ob Objective-C etwas Ähnliches hat.


15
2018-01-12 22:50


Ursprung


Antworten:


Es gibt jetzt __auto_type. Beispielsweise...

__auto_type test = @"Hello World";

... ergibt einen Test vom Typ NSString *.

Hier ist eine anständige Beschreibung:

https://medium.com/@maicki/type-inferenz-mit-auto-type-55a38ef56372

Der Autor schlägt vor, zu verwenden

#define let __auto_type const
#define var __auto_type

in einer freigegebenen Kopfzeile in Ihrer Anwendung, um die Verwendung sauberer zu machen. Ich bin etwas vorsichtig mit dieser Art von Makro-Nutzung, aber ich mache es schon eine Weile, und die Welt dreht sich immer noch ... Vielleicht sind Makro-Namen, die weniger wahrscheinlich eine Kollision verursachen, besser.


2
2018-01-09 00:55



Ja und nein.

Sie können verwenden id foo = ... Das wird immer funktionieren, aber Sie verlieren die Typinformationen.

Wenn Sie wirklich etwas Äquivalentes möchten, könnten Sie verwenden auto foo = ... von C ++ 11, aber dann müssen Sie Ihre Datei als Objective-C ++ kompilieren, die viele andere Nebenwirkungen hat.

Konvention ist, nur Ihre Arten zu buchstabieren; Es ist ärgerlich, aber im Gegensatz zu C ++, C #, Java, wo Templates / Generics Typnamen sehr lang machen können, ist es normalerweise in Objective-C überschaubar.


14
2018-01-12 22:57



Nein, es gibt kein Äquivalent in Objective C. C ++ 11 führte die auto Stichwort, um es zu tun, aber weder C noch Objective C hat eine ähnliche Fähigkeit.

Das id ist C # am nächsten dynamic Stichwort. Damit können Sie ähnliche Ergebnisse erzielen var, mit der Ausnahme, dass Sie nicht über die Eigenschaftensyntax auf Eigenschaften zugreifen können. Sie können Methoden aufrufen, einschließlich Methoden, die Eigenschaftenaccessoren implementieren.


5
2018-01-12 22:57



Sie können so etwas tun:

__typeof([obj someMethod]) foo = [obj someMethod];

Das ist hässlich, aber wenn Sie ein Schnipsel oder Makro haben, das automatisch generiert wird, müssen Sie die Typnamen nicht eingeben. Beispielsweise:

#define LET(V, EXPR) __typeof(EXPR) V = (EXPR)

LET(vc, self.viewController);  // equivalent to "UIViewController* vc = self.viewController;"
LET(d, [number doubleValue]);  // equivalent to "double d = [number doubleValue];"
LET(foo, [[Foo alloc] init]);  // equivalent to "Foo *foo = [[Foo alloc] init];"

Hinweis: Ich bin nicht empfehle Dieser Ansatz, wie die Konvention in Objective-C ist, ist die vollständige Typnamen oder verwenden idund Makros können unordentlich sein. Aber darüber zu wissen __typeof() kann praktisch sein.


5
2018-03-26 17:57



Dort ist der id Schlüsselwort in Objective-C, aber beachten Sie, dass es dem entspricht dynamic Stichwort in C # und nicht die var Stichwort. var ist implizite Typisierung - dh der Typ wird abgeleitet, aber es ist immer noch statische Typisierung. dynamic und id sind für dynamisches Tippen und Sie verlieren Typinformationen.


4
2018-01-12 22:58



Ich befürchte, dass es in Ziel C kein solches Äquivalent gibt, mit dem Sie eine starke Typisierung bewahren könnten.


2
2018-01-12 22:57



Sie können verwenden Ich würde Schlüsselwort in Ziel C, aber es funktioniert nicht als c #

in c #

var stringVar = ...

stringVar arbeitete als String-Variable und Sie können die String-Funktion auf diese Weise zugreifen stringVar.function

id stringVar = [NSString ...]

aber es funktioniert immer noch als normaler ID-Typ.


0
2018-01-12 23:52