Avec l'introduction de Swift, j'ai essayé de comprendre la nouvelle langue
Je suis un développeur iOS et j'utiliserais des types tels que NSString, NSInteger, NSDictionary
dans une application. J'ai remarqué que dans l'ebook "The Swift Programming Language" d'Apple, ils utilisent les types SwiftString, Int, Dictionary
J'ai remarqué que les types Swift n'ont pas (ou sont nommés différemment) certaines des fonctions des types Foundation. Par exemple NSString
a une length
propriété. Mais je n'ai pas pu en trouver un similaire pour le Swift String
.
Je me demande, pour une application iOS, devrais-je toujours utiliser les types Foundation?
String
. Cependant, laString
fonctionnalité est encore un peu limitée dans la version alpha, elleNSString
sera donc plus utilisée pour le moment. Nous espérons qu'ils corrigeront l'API jusqu'à GA.countElements(str)
pour répondre à cette partie spécifique de votre question."foo".length" directly in Swift. An implicit cast to
NSString` est ajouté pour vous par le compilateur!Réponses:
Vous devez utiliser les types natifs Swift dans la mesure du possible. Le langage est optimisé pour les utiliser et la plupart des fonctionnalités sont reliées entre les types natifs et les
Foundation
types.Alors que
String
etNSString
sont pour la plupart interchangeables, c'est-à-dire que vous pouvez passer desString
variables dans des méthodes qui prennent desNSString
paramètres et vice versa, certaines méthodes ne semblent pas être automatiquement pontées à partir de ce moment. Voir cette réponse pour une discussion sur la façon d'obtenir la longueur d'une chaîne et cette réponse pour une discussion sur l'utilisationcontainsString()
de la vérification des sous-chaînes. (Avertissement: je suis l'auteur de ces deux réponses)Je n'ai pas complètement exploré d'autres types de données, mais je suppose qu'une version de ce qui a été indiqué ci-dessus sera également vraie pour
Array
/NSArray
,Dictionary
/NSDictionary
, et les différents types de nombres dans Swift etNSNumber
Chaque fois que vous avez besoin d'utiliser l'un des types Foundation, vous pouvez soit les utiliser pour taper des variables / constantes explicitement, comme dans,
var str: NSString = "An NSString"
soit les utiliserbridgeToObjectiveC()
sur une variable / constante existante de type Swift, commestr.bridgeToObjectiveC().length
par exemple. Vous pouvez également convertir unString
en unNSString
en utilisantstr as NSString
.Cependant, la nécessité pour ces techniques d'utiliser explicitement les types Foundation, ou du moins certains d'entre eux, peut être obsolète à l'avenir, car d'après ce qui est indiqué dans la référence du langage, le
String
/NSString
bridge, par exemple, devrait être complètement transparent.Pour une discussion approfondie sur le sujet, reportez-vous à Utilisation de Swift avec Cocoa et Objective-C: Utilisation des types de données Cocoa
la source
bridgeToObjectiveC()
et l'explication de la connexion entre NSString et Swift's String.NSString: crée des objets qui résident dans le tas et toujours passés par référence.
String: C'est un type valeur chaque fois que nous le transmettons, il est passé par valeur. comme Struct et Enum, String lui-même est un Struct dans Swift.
Mais la copie n'est pas créée lorsque vous passez. Il crée une copie lors de sa première mutation.
La chaîne est automatiquement pontée vers Objective-C en tant que NSString. Si la bibliothèque standard Swift n'en possède pas, vous devez importer le framework Foundation pour accéder aux méthodes définies par NSString.
Swift String est très puissant, il a pléthore de fonctions intégrées.
Maintenant, String est capable d'effectuer toutes les opérations que n'importe qui peut effectuer sur le type Collection.
Pour plus d'informations, veuillez consulter les documents Apple.
la source
Votre meilleur pari est d'utiliser des types et des classes natifs Swift, comme certains autres l'ont noté que NSString a une traduction gratuite en String, cependant, ils ne sont pas les mêmes à 100%, prenez par exemple ce qui suit
vous devez utiliser la méthode count () pour compter les caractères dans la chaîne, notez également que nsstring.length renvoie 2, car il compte sa longueur en fonction de UTF16.
Similaire, OUI Le même, NON
la source
String
etNSString
sont interchangeables, donc peu importe celui que vous utilisez. Vous pouvez toujours lancer entre les deux, en utilisantou même
NSInteger
est juste un alias pour anint
ou along
(en fonction de l'architecture), donc j'utiliserais simplementInt
.NSDictionary
est une question différente, puisqu'ilDictionary
s'agit d'une implémentation complètement distincte.En général, je m'en tiendrais aux types swift chaque fois que possible et vous pouvez toujours convertir entre les deux au besoin, en utilisant la
bridgeToObjectiveC()
méthode fournie par les classes swift.la source
Int
type de données de Swift est indiqué, dans le livre, comme étant le même que la taille des mots de l'architecture.NSInteger
est également de la même taille que la taille du mot de l'architecture.Puisque les types objectifs C sont toujours distribués dynamiquement, ils seront probablement plus lents. Je dirais que vous êtes mieux servi en utilisant les types natifs Swift, sauf si vous avez besoin d'interagir avec les API objective-c
la source
Utilisez les types natifs Swift chaque fois que vous le pouvez. Dans le cas de String, cependant, vous avez un accès "transparent" à toutes les
NSString
méthodes comme celle-ci:la source
Mise à jour Swift 4
La chaîne reçoit des révisions dans swift 4. Vous pouvez maintenant appeler directement le compte dessus et considérer les grappes de graphèmes comme une seule pièce, comme un emoji. NSString n'est pas mis à jour et le compte d'une autre manière.
la source
NSString
s ne seront probablement pas mis à jour pour traiter les clusters de graphèmes: cela briserait trop d'applications qui reposent sur l'ancien comportement. En outre,NSString.length
compte les caractères UTF16.La chaîne est une structure
// dans le module Swift
public struct String
{
}
NSString est une classe
// dans le module Fondation
classe ouverte NSString: NSObject
{
}
la source