2017-01-08 2 views
1

Als Apfel eine neue Syntax für Array Eingeführt wörtlichen und Wörterbuch Literale:Warum gibt es keine konstante NSArray Wörtliche und NSDictionary Wörtliche

NSArray* literalArray = @[@"1", @"2", @"3"]; 

//Dictionary Literal 
NSDictionary* literalDictionary = @{@1:@"first", @2:@"Second", @3:@"Third"}; 

Sie sind nicht wie Stringliterale verhalten. Meine Frage ist, was kann der Grund sein, dass sie NSCFConstantArray-Klasse ähnlich wie NSCFConstantString nicht eingeführt haben? Welchen Nachteil hat die Einführung einer neuen Klasse außer der Abwärtskompatibilität?

+2

Haben Sie versucht, eines davon zu ändern? War dein Versuch erfolgreich? Suchen Sie nach 'NSMutableArray' und' NSMutableDictionary'. – dasblinkenlight

+1

Genau welches String-Literal-Verhalten suchen Sie außerhalb von Array-Literalen? In "NSCFConstantString" gibt es eine Menge sehr spezifischer Speicherinhalte, die bei Sammlungen nicht annähernd anwendbar sind. Und denken Sie daran, nur weil Sie mit Array-Literal arbeiten, bedeutet das nicht, dass alles in dieser Sammlung unveränderlich ist. Oder sprichst du davon, dass dieses "NSCFConstantArray" nur verwendet wird, wenn bekannt ist, dass alles in dieser unveränderlichen Sammlung unveränderlich ist? Fazit, welches Problem versuchen Sie mit diesem 'NSCFConstantArray' zu lösen? – Rob

Antwort

3

Dies hätte implementiert werden können, aber es wäre wahrscheinlich nicht sehr nützlich. Damit dies funktioniert, müsste auch alles im Array oder Dictionary eine Kompilierzeitkonstante sein. Dies wäre ziemlich einschränkend - ohne irgendwelche anderen Änderungen wären Sie nur in der Lage, Arrays und Wörterbücher zu erstellen, die nur Strings enthalten. Die Zahlenliterale sind auch keine Kompilierzeitkonstanten. Natürlich könnten diese auch als Kompilierzeitkonstanten implementiert werden.

Aber diese ganze Sache wäre nicht sehr nützlich. In den meisten Fällen verwenden Sie diese Literale, um einige zur Laufzeit bekannte Werte in Arrays oder Wörterbücher zu schreiben. Es ist wahrscheinlich nicht wert, all die Schwierigkeiten durchzugehen, um all das umzusetzen.

+0

Danke für die Information. –

0

Es würde bedeuten, zusätzliches "unangemessenes" Wissen über bestimmte Foundation-Klassen in den Compiler einzufügen und es enger an Apples Frameworks zu binden, anstatt ein Allzweck-Compiler zu sein.

Zum Beispiel könnte es die Verwendung des Compilers mit GNUStep anstelle von Cocoa stören.

Die Integration mit NSString ist seit langem und kann jetzt nicht entfernt werden, aber das Hinzufügen von mehr solcher Integration müsste ein überzeugendes Argument dafür haben.

+0

Sie müssten den Compiler nicht über Foundation-Klassen informieren. Der Compiler könnte für diese ein Speicherlayout definieren, wie dies für die String-Integration der Fall ist, und es wäre die Aufgabe von Foundations, Klassen bereitzustellen, die genau dieses Speicherlayout haben. Funktioniert für NSString gleich - Sie können dem Compiler mitteilen, welche Klasse für String-Literale verwendet werden soll. – Sven

Verwandte Themen