Swift - types à utiliser? NSString ou Chaîne
Avec l'introduction de Swift, j'ai essayé d'obtenir ma tête autour du langage
Je suis un développeur iOS et permettrait d'utiliser des types comme NSString, NSInteger, NSDictionary
dans une application. J'ai remarqué que dans la "Le Langage de Programmation Swift" ebook par Apple, ils utilisent la Swift types String, Int, Dictionary
J'ai remarqué que la Swift types n'ont pas (ou sont nommées différemment) certaines des fonctions les types de Fondation de le faire. Par exemple NSString
a un length
de la propriété. Mais je n'ai pas été en mesure de trouver un similaire pour la Swift String
.
Je me demandais, pour une application iOS devrais-je continuer à utiliser les types de Fondation?
- Préférez
String
. Cependant,String
fonctionnalité est encore un peu limité dans la version alpha, doncNSString
sera plus utilisé pour le moment. Nous espérons qu'elles vont fixer l'API jusqu'à ce que GA. - Aussi, vous pouvez appeler
countElements(str)
, pour répondre à cette partie de votre question. - Mieux, vous pouvez appeler
"foo".length" directly in Swift. An implicit cast to
NSString " est ajouté par le compilateur! - peut ne pas fonctionner correctement pour les caractères spéciaux. Comme des Émoticônes ou des caractères Chinois qui prennent 2 ou 3 caractères unicode. countElements est la bonne méthode à utiliser.
Vous devez vous connecter pour publier un commentaire.
Vous devez utiliser la Swift types natifs chaque fois que possible. La langue est optimisé pour l'utilisation d'entre eux, et la plupart des fonctionnalités est comblé entre les autochtones et les
Foundation
types.Tout
String
etNSString
sont pour la plupart interchangeables, j'.e, vous pouvez passerString
des variables dans des méthodes qui prennentNSString
paramètres et vice versa, certaines méthodes semblent pas être automatiquement comblé en ce moment. Voir cette réponse pour une discussion sur la façon d'obtenir la longueur de la Chaîne et cette réponse pour une discussion sur l'utilisation decontainsString()
à vérifier pour les sous-chaînes. (Disclaimer: je suis l'auteur de ces deux réponses)Je n'ai pas encore totalement exploré d'autres types de données, mais je suppose que certaines version de ce qui a été indiqué ci-dessus sera également vrai pour
Array
/NSArray
,Dictionary
/NSDictionary
, et les différents types de numéro rapide etNSNumber
Chaque fois que vous devez utiliser l'un des types de base, vous pouvez les utiliser pour le type de variables/constantes explicitement, comme dans
var str: NSString = "An NSString"
ou de l'utilisationbridgeToObjectiveC()
sur une variable/constante d'un Swift type, comme dansstr.bridgeToObjectiveC().length
par exemple. Vous pouvez également jeter unString
à unNSString
en utilisantstr as NSString
.Cependant, la nécessité pour ces techniques à utiliser explicitement les types de Fondation, ou au moins certains d'entre eux, peut être obsolète dans l'avenir, car à partir de ce qui est indiqué dans la langue de référence, le
String
/NSString
pont, par exemple, doit être complètement transparent.Pour une discussion approfondie sur le sujet, reportez-vous à L'utilisation de Swift avec Cocoa et Objective-C: Travail avec le Cacao Types de Données
bridgeToObjectiveC()
et expliquer le lien entre NSString et rapide de la Chaîne.NSString : Crée des objets qui se trouve dans le tas et toujours passés par référence.
De la chaîne: c'est un type de valeur à chaque fois que nous le transmettre , à son passé par valeur.
comme Struct et Enum, Chaîne elle-même une Structure en Swift.
Mais la copie n'est pas créé lorsque vous passez. Il crée de la copie lors de la première pour les transformer.
Chaîne est automatiquement relié à Objective-C comme NSString. Si la Norme Swift Bibliothèque n'a pas, vous devez importer le cadre de la Fondation pour obtenir l'accès à des méthodes définies par NSString.
Swift Chaîne est très puissant, il a pléthore de intégré fonctions.
Maintenant de Chaîne est capable d'effectuer toutes les opérations que n'importe qui peut
effectuer sur le type de Collection.
Pour plus d'informations, veuillez vous reporter apple documents.
Votre meilleur pari est d'utiliser Swift natif de types et de classes, comme certains l'ont noté NSString a sans frais de traduction de Chaîne, cependant, ils ne sont pas les mêmes à 100%, prenez par exemple les éléments suivants
vous devez utiliser la méthode count() pour compter les caractères dans la chaîne, notez également que nsstring.longueur renvoie 2, car il compte de sa longueur basé sur UTF16.
Similaire, OUI
De même, AUCUNE
String
etNSString
sont interchangeables, de sorte qu'il n'importe pas vraiment celui que vous utilisez. Vous pouvez toujours jeté entre les deux, à l'aide deou même
NSInteger
est juste un alias pour unint
ou unlong
(en fonction de l'architecture), de sorte que je venais d'utiliserInt
.NSDictionary
est une autre question, depuisDictionary
est complètement distincte de la mise en œuvre.En général, je collerais à swift types chaque fois que possible et vous pouvez toujours convertir entre les deux, au besoin, à l'aide de la
bridgeToObjectiveC()
méthode prévue par swift classes.Int
type de données est dit, dans le livre, la même que l'architecture de la taille de mot.NSInteger
est également de la même taille que la taille de mot de l'architecture.Étant donné que l'objectif C types sont toujours dynamiquement distribué ils vont sans doute être plus lent. Je dirais que vous êtes mieux servi en utilisant la Swift types natifs, sauf si vous avez besoin d'interagir avec objective-c Api
Utiliser la Swift types natifs chaque fois que vous le pouvez. Dans le cas de la Chaîne, cependant, vous avez "sans couture" accès à tous les
NSString
méthodes comme ceci:Swift 4 mise à jour
Chaîne est révisions swift 4. Maintenant, vous pouvez appeler directement compter sur elle et d'envisager de le graphème des clusters de 1 pièce, comme un emoji. NSString n'est pas mis à jour et le compte d'une autre manière.
NSString
s ne sera probablement pas mis à jour pour traiter graphème clusters: Elle allait se briser trop grand nombre d'applications qui s'appuient sur l'ancien comportement. Aussi,NSString.length
compte le UTF16 caractères.