Mit der Einführung von Swift habe ich versucht, mich mit der neuen Sprache vertraut zu machen
Ich bin ein iOS-Entwickler und würde Typen wie NSString, NSInteger, NSDictionary
in einer Anwendung verwenden. Ich habe festgestellt, dass im E-Book "The Swift Programming Language" von Apple die Swift-Typen verwendet werdenString, Int, Dictionary
Ich habe festgestellt, dass die Swift-Typen einige der Funktionen der Foundation-Typen nicht haben (oder anders benannt sind). Hat zum Beispiel NSString
eine length
Eigenschaft. Aber ich konnte keinen ähnlichen für den Swift finden String
.
Ich frage mich, ob ich für eine iOS-Anwendung weiterhin die Foundation-Typen verwenden soll.
String
. DieString
Funktionalität ist in der Alpha-Version jedoch noch etwas eingeschränkt und wird daherNSString
vorerst stärker genutzt. Wir hoffen, dass sie die API bis GA reparieren.countElements(str)
, um diesen bestimmten Teil Ihrer Frage zu beantworten."foo".length" directly in Swift. An implicit cast to
NSString aufrufen` wird vom Compiler für Sie hinzugefügt!Antworten:
Sie sollten nach Möglichkeit die nativen Swift-Typen verwenden. Die Sprache ist für ihre Verwendung optimiert, und die meisten Funktionen werden zwischen den nativen Typen und den
Foundation
Typen überbrückt .Während
String
undNSString
meistens austauschbar sind, dh Sie könnenString
Variablen an Methoden übergeben, dieNSString
Parameter annehmen und umgekehrt, scheinen einige Methoden ab diesem Moment nicht automatisch überbrückt zu werden. In dieser Antwort finden Sie eine Diskussion zum Abrufen der Länge eines Strings. In dieser Antwort finden Sie eine DiskussioncontainsString()
zum Überprüfen auf Teilzeichenfolgen. (Haftungsausschluss: Ich bin der Autor für beide Antworten)Ich habe andere Datentypen nicht vollständig untersucht, aber ich gehe davon aus, dass eine Version der oben genannten auch für
Array
/NSArray
,Dictionary
/NSDictionary
und die verschiedenen Nummerntypen in Swift und giltNSNumber
Wenn Sie einen der Foundation-Typen verwenden müssen, können Sie diese entweder verwenden, um Variablen / Konstanten explizit einzugeben, wie in
var str: NSString = "An NSString"
oderbridgeToObjectiveC()
für eine vorhandene Variable / Konstante eines Swift-Typs, wie instr.bridgeToObjectiveC().length
. Sie können a auch in a umwandelnString
,NSString
indem Sie verwendenstr as NSString
.Die Notwendigkeit, dass diese Techniken die Foundation-Typen oder zumindest einige von ihnen explizit verwenden, kann jedoch in Zukunft überholt sein, da beispielsweise die
String
/NSString
bridge nach den Angaben in der Sprachreferenz vollständig nahtlos sein sollte.Eine ausführliche Diskussion zu diesem Thema finden Sie unter Verwenden von Swift mit Kakao und Objective-C: Arbeiten mit Kakaodatentypen
quelle
bridgeToObjectiveC()
und die Erläuterung der Verbindung zwischen NSString und Swift's String.NSString: Erstellt Objekte, die sich im Heap befinden und immer als Referenz übergeben werden.
String: Es ist ein Werttyp, wenn wir ihn übergeben, er wird als Wert übergeben. String wie Struct und Enum selbst ein Struct in Swift.
Eine Kopie wird jedoch nicht erstellt, wenn Sie bestanden haben. Es erstellt eine Kopie, wenn Sie es zum ersten Mal mutieren.
Die Zeichenfolge wird automatisch als NSString an Objective-C überbrückt. Wenn die Swift Standard Library nicht vorhanden ist, müssen Sie das Foundation-Framework importieren, um Zugriff auf von NSString definierte Methoden zu erhalten.
Swift String ist sehr leistungsfähig und verfügt über eine Vielzahl integrierter Funktionen.
Jetzt kann String alle Operationen ausführen, die jeder für den Sammlungstyp ausführen kann.
Weitere Informationen finden Sie in den Apple-Dokumenten.
quelle
Am besten verwenden Sie native Swift-Typen und -Klassen, da einige andere festgestellt haben, dass NSString eine gebührenfreie Übersetzung in String bietet. Sie sind jedoch nicht zu 100% gleich, z. B. die folgenden
Sie müssen die Methode count () verwenden, um die Zeichen in der Zeichenfolge zu zählen. Beachten Sie außerdem, dass nsstring.length 2 zurückgibt, da die Länge basierend auf UTF16 gezählt wird.
Ähnlich, JA Das gleiche, NEIN
quelle
String
undNSString
sind austauschbar, so dass es nicht wirklich wichtig ist, welche Sie verwenden. Sie können immer zwischen den beiden mit verwendenoder auch
NSInteger
ist nur ein Alias für einint
oder einlong
(abhängig von der Architektur), also würde ich nur verwendenInt
.NSDictionary
ist eine andere Sache, daDictionary
es sich um eine völlig separate Implementierung handelt.Im Allgemeinen würde ich mich nach Möglichkeit an schnelle Typen halten, und Sie können bei Bedarf jederzeit zwischen den beiden konvertieren, indem Sie die
bridgeToObjectiveC()
von schnellen Klassen bereitgestellte Methode verwenden.quelle
Int
Datentyp von Swift wird im Buch als mit der Wortgröße der Architektur identisch angegeben.NSInteger
ist auch die gleiche Größe wie die Wortgröße der Architektur.Da die Ziel-C-Typen immer noch dynamisch versendet werden, werden sie wahrscheinlich langsamer sein. Ich würde sagen, dass Sie am besten mit den nativen Swift-Typen bedient werden, es sei denn, Sie müssen mit Objective-C-APIs interagieren
quelle
Verwenden Sie die nativen Swift-Typen, wann immer Sie können. Im Fall von String haben Sie jedoch "nahtlosen" Zugriff auf alle
NSString
Methoden wie folgt:quelle
Swift 4 Update
String erhält Revisionen in Swift 4. Jetzt können Sie count direkt darauf aufrufen und es betrachtet Graphemcluster als 1 Stück, wie ein Emoji. NSString wird nicht aktualisiert und zählt es auf andere Weise.
quelle
NSString
s wird wahrscheinlich nicht aktualisiert, um mit Graphemclustern fertig zu werden: Es würde zu viele Apps beschädigen, die auf dem alten Verhalten beruhen. AußerdemNSString.length
zählt die UTF16 Zeichen.String ist eine Struktur
// im Swift-Modul
public struct String
{
}}
NSString ist eine Klasse
// im Foundation-Modul
offene Klasse NSString: NSObject
{
}}
quelle