web-dev-qa-db-fra.com

Swift - Fractionner une chaîne sur plusieurs lignes

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

var text:String = "This is some text
                   over multiple lines"
216

Swift 4 inclut la prise en charge de les littéraux de chaîne multiligne . En plus des nouvelles lignes, ils peuvent également contenir des guillemets non échappés.

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éraux sur plusieurs lignes:

var text = "This is some text\n"
         + "over multiple lines\n"
374
Connor

J'ai utilisé une extension sur String pour obtenir des chaînes multilignes tout en évitant le bogue bloquante du compilateur. Il vous permet également de spécifier un séparateur afin que vous puissiez l'utiliser un peu comme la fonction join 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
mcornell

Ce fut la première chose décevante à propos de Swift que j'ai remarquée. Presque tous les langages de script autorisent les chaînes multilignes.

C++ 11 a ajouté des littéraux de chaîne bruts vous permettant de définir votre propre terminateur

C # a ses @literals pour les chaînes multilignes.

Même le langage C simple, et donc l'ancien C++ et l'Objective-C, permettent la concaténation en plaçant simplement plusieurs littéraux adjacents, afin que les guillemets soient réduits. Les espaces ne comptent pas lorsque vous faites cela, vous pouvez donc les placer sur différentes lignes (mais vous devez ajouter vos propres nouvelles lignes):

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

Comme Swift ignore que vous avez mis votre texte sur plusieurs lignes, je dois corriger l’échantillon de connor, de la même manière que mon exemple C, indiquant explicitement le retour à la ligne:

var text:String = "This is some text \n" +
                  "over multiple lines"
26
Andy Dent

Comme souligné par litso, l'utilisation répétée de +- dans une expression peut conduire à une suspension de XCode Beta (juste vérifiée avec XCode 6 Beta 5): Xcode 6 Beta non compilé

Une alternative pour les chaînes multilignes consiste pour le moment à utiliser un tableau de chaînes et reduce 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
Jonas Reinsch

Les chaînes multi-lignes sont possibles à partir de Swift 4.0, mais il existe quelques règles:

  1. Vous devez commencer et terminer vos chaînes par trois guillemets, """.
  2. Le contenu de votre chaîne doit commencer sur sa propre ligne.
  3. Le """ final doit également commencer sur sa propre ligne.

En dehors de cela, vous êtes prêt à partir! 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 les nouveautés de Swift 4 pour plus d'informations.

14
TwoStraws

Swift 4 a résolu ce problème en offrant un support littéral sur plusieurs lignes. Pour commencer, ajoutez trois guillemets doubles ("" ") et appuyez sur la touche Retour. comme vous écrivez dans le bloc-notes ou n'importe quel éditeur de texte. Pour mettre fin aux littéraux de plusieurs lignes, écrivez à nouveau (”” ”) 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)
8
Nareshkumar Nil

Rapide:

@connor est la bonne réponse, mais si vous souhaitez ajouter des lignes dans une instruction print que vous recherchez est \n et/ou \r, elles sont appelées séquences d'échappement ou caractères échappés, il s'agit d'un lien vers la documentation Apple sur le site. sujet. .

Exemple:

print("First line\nSecond Line\rThirdLine...")
5
Juan Boero

Pour ajouter à la réponse @Connor, il doit également y avoir\n. Voici le code révisé:

var text:String = "This is some text \n" +
                  "over multiple lines"
4
Pandurang Yachwad

L'exemple suivant décrit une continuation multiligne, utilisant des parenthèses comme une solution de contournement simple pour le bogue Swift à partir de la version bêta de Xcode 6.2, où il se plaint que l'expression est trop complexe pour être résolue dans un délai raisonnable et qu'il est envisagé de la décomposer en plusieurs pièces:

    .
    .
    .
    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
clearlight

Vous pouvez utiliser unicode égal à enter ou \n et les implémenter dans votre chaîne. Par exemple: \u{0085}.

0
hooman

Voici un extrait de code permettant de scinder une chaîne en 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
Michael N

Une approche consiste à définir le texte de l'étiquette sur attributText et à mettre à jour la variable chaîne pour inclure le code HTML pour le saut de ligne (<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

J'espère que cela t'aides!

0
B-Rad

Échantillon

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

Au cas où vous ne trouvez pas l'opérateur + approprié

0
Danielle Cohen

Une autre façon si vous voulez utiliser une variable chaîne avec du texte prédéfini,

var textFieldData:String = "John"
myTextField.text = NSString(format: "Hello User, \n %@",textFieldData) as String
myTextField.numberOfLines = 0
0
Zoran777