Swift-Split string sur plusieurs lignes

Comment pourrais-je diviser une chaîne sur plusieurs lignes comme ci-dessous?

var text:String = "This is some text
                   over multiple lines"
198
demandé sur Moritz 2014-06-07 01:56:55

15 réponses

Swift 4 inclut le support pour multi-ligne littéraux de chaîne . En plus des newlines, ils peuvent aussi contenir des guillemets.

var text = """
    This is some text
    over multiple lines
    """

les anciennes versions de Swift ne vous permettent pas d'avoir un seul littéral sur plusieurs lignes, mais vous pouvez ajouter des littérales ensemble sur plusieurs lignes:

var text = "This is some text\n"
         + "over multiple lines\n"
333
répondu Connor 2018-05-18 12:33:02

j'ai utilisé une extension sur Chaîne pour obtenir des chaînes multilignes tout en évitant le bogue de suspension du compilateur. Il vous permet également de spécifier un séparateur de sorte que vous pouvez l'utiliser un peu comme la fonction de jointure de Python

extension String {
    init(sep:String, _ lines:String...){
        self = ""
        for (idx, item) in lines.enumerated() {
            self += "\(item)"
            if idx < lines.count-1 {
                self += sep
            }
        }
    }

    init(_ lines:String...){
        self = ""
        for (idx, item) in lines.enumerated() {
            self += "\(item)"
            if idx < lines.count-1 {
                self += "\n"
            }
        }
    }
}



print(
    String(
        "Hello",
        "World!"
    )
)
"Hello
World!"

print(
    String(sep:", ",
        "Hello",
        "World!"
    )
)
"Hello, World!"
30
répondu mcornell 2017-02-08 23:16:57

ce fut la première chose décevante chez Swift que j'ai remarqué. Presque tous les langages de script permettent des chaînes multilignes.

C++11 a ajouté des lignes brutes littérales qui vous permettent de définir votre propre terminator

C# a son @littéraux multi-lignes brisées.

même c simple et donc c++ démodé et Objectif-C permettent la concatentation simplement en mettant plusieurs littérales adjacentes, de sorte que les citations sont effondrées. Whitespace ne compte pas quand vous faites cela de sorte que vous pouvez les mettre sur des lignes différentes (mais besoin d'ajouter vos propres lignes):

const char* text = "This is some text\n"
                   "over multiple lines";

comme swift ne sait pas que vous avez mis votre texte sur plusieurs lignes, je dois corriger l'échantillon de connor, similaire à mon échantillon C, en indiquant explicitement la nouvelle ligne:

var text:String = "This is some text \n" +
                  "over multiple lines"
26
répondu Andy Dent 2017-05-23 12:18:25

comme le souligne litso, l'utilisation répétée de L'opérateur + dans une expression peut conduire à Xcode beta pendaison (vient de vérifier avec Xcode 6 Beta 5): Xcode 6 Beta ne compilant pas

une alternative pour les chaînes multilignes pour le moment est d'utiliser un tableau de chaînes et reduce it avec + :

var text = ["This is some text ",
            "over multiple lines"].reduce("", +)

ou, sans doute plus simple, en utilisant join :

var text = "".join(["This is some text ",
                    "over multiple lines"])
15
répondu Jonas Reinsch 2017-05-23 11:55:03

les chaînes multilignes sont possibles à partir de Swift 4.0, mais il y a quelques règles:

  1. vous devez démarrer et terminer vos cordes avec trois doubles guillemets, """ .
  2. votre contenu de chaîne de caractères doit commencer sur sa propre ligne.
  3. la terminaison """ doit également commencer sur sa propre ligne.

à part ça, tu peux y aller! Voici un exemple:

let longString = """
When you write a string that spans multiple
lines make sure you start its content on a
line all of its own, and end it with three
quotes also on a line of their own.
Multi-line strings also let you write "quote marks"
freely inside your strings, which is great!
"""

voir Quoi de neuf en Swift 4 pour plus de renseignements.

12
répondu TwoStraws 2017-05-16 15:43:59

Swift 4 a résolu ce problème en fournissant un support littéral Multi-ligne pour les chaînes de caractères.Pour commencer la chaîne de caractères littérale ajouter trois guillemets doubles ( "" ) et appuyez sur la touche retour, après avoir appuyé sur la touche Retour commencer à écrire les chaînes de caractères avec n'importe quelles variables , les sauts de ligne et les guillemets doubles tout comme vous écririez dans le bloc-notes ou n'importe quel éditeur de texte. Pour terminer la chaîne de caractères littérale nouvelle écriture ( "" ) dans la nouvelle ligne.

Voir Ci-Dessous Exemple

     let multiLineStringLiteral = """
    This is one of the best feature add in Swift 4
    It let’s you write “Double Quotes” without any escaping
    and new lines without need of “\n”
    """

print(multiLineStringLiteral)
6
répondu Nareshkumar Nil 2017-06-01 06:01:11

Swift:

@connor est la bonne réponse, mais si vous voulez ajouter des lignes dans une déclaration imprimée ce que vous recherchez est \n et/ou \r , ce sont des séquences D'évasion ou des caractères échappés, c'est un lien vers la documentation Apple sur le sujet. .

exemple:

print("First line\nSecond Line\rThirdLine...")
5
répondu Juan Boero 2016-09-28 14:51:49

ajoutant à la réponse de @ Connor, il doit y avoir \n aussi. Voici le code révisé:

var text:String = "This is some text \n" +
                  "over multiple lines"
4
répondu Pandurang Yachwad 2015-07-31 06:28:45

l'exemple suivant décrit une suite multi-lignes, en utilisant la parenthèse comme une simple solution de contournement pour le bogue Swift à partir du Xcode 6.2 Beta, où il se plaint que l'expression est trop complexe à résoudre dans un délai raisonnable, et d'envisager de la décomposer en morceaux plus petits:

    .
    .
    .
    return String(format:"\n" +
                    ("    part1:    %d\n"    +
                     "    part2:    %d\n"    +
                     "    part3:  \"%@\"\n"  +
                     "    part4:  \"%@\"\n"  +
                     "    part5:  \"%@\"\n"  +
                     "    part6:  \"%@\"\n") +
                    ("    part7:  \"%@\"\n"  +
                     "    part8:  \"%@\"\n"  +
                     "    part9:  \"%@\"\n"  +
                     "    part10: \"%@\"\n"  +
                     "    part12: \"%@\"\n") +
                     "    part13:  %f\n"     +
                     "    part14:  %f\n\n",
                    part1, part2, part3, part4, part5, part6, part7, part8, 
                    part9, part10, part11, part12, part13, part14)
    .
    .
    .
3
répondu clearlight 2016-08-16 09:30:09

une autre façon si vous voulez utiliser une variable chaîne de caractères avec un texte prédéfini,

var textFieldData:String = "John"
myTextField.text = NSString(format: "Hello User, \n %@",textFieldData) as String
myTextField.numberOfLines = 0
0
répondu Zoran777 2015-07-02 12:12:11

vous pouvez utiliser unicode égal pour enter ou \n et les mettre en œuvre à l'intérieur de votre chaîne de caractères. Par exemple: \u{0085} .

0
répondu hooman 2015-07-31 06:30:12

échantillon

var yourString = "first line \n second line \n third line"

dans le cas où, vous ne trouvez pas l'opérateur + approprié

0
répondu Danielle Cohen 2016-02-09 03:25:46

une approche consiste à définir le texte de l'étiquette à attributedText et à mettre à jour la variable string pour inclure le HTML pour line break ( <br /> ).

par exemple:

var text:String = "This is some text<br />over multiple lines"
label.attributedText = text

sortie:

This is some text
over multiple lines

Espérons que cette aide!

0
répondu B-Rad 2016-02-19 20:37:57

voici un extrait de code pour séparer une chaîne par N caractères séparés par des lignes:

//: A UIKit based Playground for presenting user interface

import UIKit
import PlaygroundSupport

class MyViewController : UIViewController {
    override func loadView() {

        let str = String(charsPerLine: 5, "Hello World!")
        print(str) // "Hello\n Worl\nd!\n"

    }
}

extension String {

    init(charsPerLine:Int, _ str:String){

        self = ""
        var idx = 0
        for char in str {
            self += "\(char)"
            idx = idx + 1
            if idx == charsPerLine {
                self += "\n"
                idx = 0
            }
        }

    }
}
0
répondu Michael N 2018-08-22 13:54:05

j'ai essayé plusieurs façons mais a trouvé une solution encore meilleure: Il suffit d'utiliser un élément" Text View". C'est du texte qui apparaît plusieurs lignes automatiquement! Trouvé ici: UITextField lignes multiples

-2
répondu Oliver Ries 2017-05-23 11:47:31