Préface
L'ajout de fonctionnalités ou de sucre de syntaxe aux chaînes de texte est courant dans divers langages de programmation. Prenez la langue C que tout le monde connaît par exemple. Une chaîne C est essentiellement un tableau de caractères, mais chaque fois que vous entrez une chaîne, vous n'avez pas besoin de saisir ['h', 'e', 'l', 'l', 'o'], il suffit de frapper bonjour, car le compilateur fait cette opération pour vous.
Des langues plus avancées telles que Swift Handles Strings non seulement en tant que tableaux de caractères, la chaîne est un type complet et a diverses caractéristiques. Regardons d'abord une fonctionnalité de String: substring.
Jetez un œil à la corde
Tout d'abord, prenons une compréhension approximative de la mise en œuvre des chaînes. Le code suivant vient de String.swift dans la bibliothèque standard:
String de struct public {public var _core: _stringcore}Bien sûr, il existe d'autres paramètres d'initialisation, mais il n'y a que cet attribut de stockage dans la déclaration! Le secret doit être dans stringcore.swift:
public struct _stringcore {public var _baseaddress: dangemutableRawpointer? var _CountandFlags: uint public var _owner: anyObject?}Il y a beaucoup d'autres choses dans ce type, mais nous nous concentrons uniquement sur les propriétés de stockage:
La situation réelle de _Stringcore est beaucoup plus compliquée que celle mentionnée ici, mais le contenu ci-dessus facilite la compréhension de certaines informations sur les chaînes: le stockage interne et la taille des chaînes.
Sous-chaîne
Comment créer une sous-chaîne dans Swift? Le moyen le plus simple est de prendre un paragraphe de la chaîne par indice:
Soit str = "Hello Swift!" Soit Slice = str [str.startIndex .. <str index = "" str = "" startIndex = "" nbsp = "" offsetby: = "" 5 = "" hello = ""> </ str>
Bien que ce soit simple, le code ne semble pas trop élégant.
L'index de la chaîne n'est pas un entier intuitif, donc l'index de position pendant l'interception doit être obtenu à l'aide de startIndex et d'index (_: offsetby :). Si vous interceptez à partir de la position de départ de la chaîne, vous pouvez omettre startIndex:
Soit withpartialRange = str [.. <str index = "" str = "" startIndex = "" nbsp = "" offsetby: = "" 5 = "" still = "" hello = ""> </tr>
Ou utilisez cette méthode dans la collection:
Soit Slice = str.prefix (5) // toujours "bonjour"
N'oubliez pas que les chaînes sont également des collections, vous pouvez donc utiliser des méthodes sous collections, telles que Prefix (), Suffix (), DropFirst (), etc.
Les principes internes de la sous-chaîne
SUBSÉRATION Un lieu magique est qu'ils réutilisent la mémoire de la chaîne parent. Vous pouvez comprendre que la sous-chaîne est l'un des paragraphes de la chaîne parent.
Par exemple, si vous coupez 100 caractères d'une chaîne de 8000 caractères, vous n'avez pas besoin de réinitialiser l'espace mémoire de 100 caractères.
Cela signifie également que vous pouvez accidentellement prolonger le cycle de vie de la chaîne des parents. S'il y a une grande chaîne, alors vous interceptez simplement un petit segment, tant que la chaîne de petit segment interceptée n'est pas libérée, la chaîne de grande segment ne sera pas publiée.
Comment la sous-chaîne est-elle effectuée?
public struct substring {interne var _slice: rangereplaceableBidirectionalslice <string> </string>L'attribut interne _slice contient toutes les informations sur la chaîne parent:
// Toujours à l'intérieur de substringinternal var _wholestring: string {return _slice._base} public var startIndex: index {return _slice.startIndex} public var endIndex: index {return _slice.endindex}Calculez la propriété _Wholestring (renvoie la chaîne parentale entière), startIndex et EndIndex sont tous deux renvoyés via le _slice interne.
On peut également voir comment Slice fait référence à la chaîne parent.
Substrat à la chaîne
Enfin, il peut y avoir de nombreuses sous-chaînes dans le code, mais le type de paramètre de la fonction nécessite une chaîne. Le processus de conversion de la sous-chaîne en chaîne est également très simple:
Selt String = String (substring)
Étant donné que les sous-chaînes partagent le même espace mémoire que sa chaîne parent, il est deviné que la création d'une nouvelle chaîne devrait initialiser un nouvel espace de stockage. Alors, quel est le processus d'initialisation de la chaîne?
Extension String {public init (_ substring: substring) {// 1 let x = substring._wholestring // 2 let start = substring.startindex let fin = substring.endindex // 3 let u16 = x._core [start.encodeffset .. <end encodedoffset = "" nbsp = "" 4a = "" if = "" "" SAMEPOSE = "nbsp =" "4a =" Dans: = "" x = "" UnicodeScalars = "" end = "" self = "" 4b = "" else = ""> </dind>Les étapes pour convertir la sous-chaîne en chaîne sont très simples, mais vous voudrez peut-être déterminer si vous devez le faire. Avez-vous besoin que le type soit une chaîne lors de l'exécution des opérations de sous-chaîne? Si toutes les opérations sur la sous-chaîne doivent être converties en chaîne, la sous-chaîne légère perdra son sens.
Résumer
Ce qui précède est l'intégralité du contenu de cet article. J'espère que le contenu de cet article a une certaine valeur de référence pour l'étude ou le travail de chacun. Si vous avez des questions, vous pouvez laisser un message pour communiquer. Merci pour votre soutien à wulin.com.