web-dev-qa-db-fra.com

Swift - Quels types utiliser? NSString ou String

Avec l'introduction de Swift, j'ai essayé de comprendre le nouveau langage.

Je suis un développeur iOS et j'utiliserais des types tels que NSString, NSInteger, NSDictionary Dans une application. J'ai remarqué que, dans le livre électronique "Le langage de programmation Swift" d'Apple, ils utilisent les types Swift String, Int, Dictionary

J'ai remarqué que les types Swift n'avaient pas (ou ont un nom différent) certaines des fonctions des types Foundation. Par exemple, NSString a une propriété length. Mais je n'ai pas réussi à en trouver un similaire pour le Swift String.

Je me demande, pour une application iOS, devrais-je toujours utiliser les types Foundation?

104
Alec

Vous devez utiliser les types natifs Swift autant que possible. La langue est optimisée pour les utiliser et la plupart des fonctionnalités sont reliées entre les types natifs et les types Foundation.

Alors que String et NSString sont généralement interchangeables, c’est-à-dire que vous pouvez passer les variables String dans des méthodes prenant des paramètres NSString et inversement, certaines méthodes semblent ne pas être automatiquement ponté à partir de ce moment. Voir cette réponse pour une discussion sur la façon d'obtenir une longueur de chaîne et cette réponse pour une discussion sur l'utilisation de containsString() pour vérifier les sous-chaînes. (Avertissement: je suis l'auteur des deux réponses)

Je n'ai pas complètement exploré les autres types de données, mais je suppose qu'une version de ce qui a été dit ci-dessus sera également vraie pour Array/NSArray, Dictionary/NSDictionary, et les différents types de nombres dans Swift et NSNumber

Chaque fois que vous devez utiliser l'un des types Foundation, vous pouvez les utiliser pour taper explicitement des variables/constantes, comme dans var str: NSString = "An NSString", Ou bien utiliser bridgeToObjectiveC() sur une variable/constante existante d'un Swift tapez, comme dans str.bridgeToObjectiveC().length par exemple. Vous pouvez également convertir un String en un NSString en utilisant str as NSString.

Cependant, la nécessité pour ces techniques d’utiliser explicitement les types Foundation, ou du moins certains d’entre eux, risque d’être obsolète à l’avenir, étant donné que, comme indiqué dans la référence du langage, le String/NSString pont, par exemple, devrait être complètement transparent.

Pour une discussion approfondie sur le sujet, reportez-vous à la section tilisation de Swift avec Cocoa et d'Objectif-C: Utilisation des types de données Cocoa

96
Cezar

NSString: Crée des objets qui résident dans le tas et sont toujours passés par référence.

String: C'est un type de valeur chaque fois que nous le transmettons, c'est passé par valeur. comme Struct et Enum, String est lui-même une structure dans Swift.

public struct String {
 // string implementation 
}

Mais la copie n'est pas créée lorsque vous réussissez. Il crée une copie lors de la première mutation.

La chaîne est automatiquement pontée vers Objective-C en tant que NSString. Si la bibliothèque standard Swift) ne l’est pas, vous devez importer le framework Foundation pour accéder aux méthodes définies par NSString.

Swift String est très puissant, il possède une pléthore de fonctions intégrées.

Initialisation sur String:

var emptyString = ""             // Empty (Mutable)
let anotherString = String()     // empty String immutable    
let a = String(false)           // from boolean: "false"
let d = String(5.999)           //  "    Double "5.99"
let e = String(555)             //  "     Int "555"
// New in Swift 4.2 
let hexString = String(278, radix: 18, uppercase: true) // "F8"

créer une chaîne à partir de valeurs répétées:

 let repeatingString = String(repeating:"123", count:2) // "123123"

Dans Swift 4 -> Les chaînes sont une collection de caractères:

Now String est capable d'exécuter toutes les opérations que tout le monde peut effectuer sur le type Collection.

Pour plus d'informations, reportez-vous à Apple documents.

24
Sandy Rawat

Votre meilleur pari est d’utiliser Swift les types et classes natifs, comme d’autres ont noté que NSString a la traduction sans frais en String. Cependant, ils ne sont pas les mêmes à 100%, prenons par exemple le Suivant

var nsstring: NSString = "\U0001F496"
var string: String = "\U0001F496"

nsstring.length
count(string)

vous devez utiliser la méthode count () pour compter les caractères de la chaîne. Notez également que nsstring.length renvoie 2, car il compte sa longueur en fonction de UTF16.

Similaire, oui la même chose, non

11
Emanuel

String et NSString sont interchangeables, le choix du type importe peu. Vous pouvez toujours lancer entre les deux, en utilisant

let s = "hello" as NSString

ou même

let s: NSString  = "hello"

NSInteger n'est qu'un alias pour un int ou un long (en fonction de l'architecture), je n'utiliserais donc que Int.

NSDictionary est une autre affaire, puisque Dictionary est une implémentation complètement séparée.

En général, je me contenterais de Swift) chaque fois que possible et vous pourrez toujours effectuer la conversion entre les deux, en utilisant la méthode bridgeToObjectiveC() fournie par Swift classes.

7

Comme les types Objective C sont toujours distribués de manière dynamique, ils vont probablement être plus lents. Je dirais que vous êtes mieux servi avec les types natifs Swift), sauf si vous avez besoin d'interagir avec les API objective-c

6
Jiaaro

Utilisez les types natifs Swift chaque fois que vous le pouvez. Dans le cas de String, toutefois, vous avez un accès "transparent" à toutes les méthodes NSString comme ceci:

var greeting = "Hello!"
var len = (greeting as NSString).length
5
Nate Cook

Swift 4 mise à jour

String obtient des révisions dans Swift 4. Maintenant, vous pouvez appeler directement sur celui-ci et il considère 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.

var nsstring: NSString = "????‍????‍????‍????"
var string: String = "????‍????‍????‍????"

print(nsstring.length) // 11
print(string.count)    // 1
4
Fangming