Come posso dividere una stringa su più righe come di seguito?
var text:String = "This is some text
over multiple lines"
Come posso dividere una stringa su più righe come di seguito?
var text:String = "This is some text
over multiple lines"
Risposte:
Swift 4 include il supporto per i letterali di stringa multilinea . Oltre alle newline possono contenere anche virgolette senza caratteri di escape.
var text = """
This is some text
over multiple lines
"""
Le versioni precedenti di Swift non ti consentono di avere un solo valore letterale su più righe ma puoi aggiungere valori letterali su più righe:
var text = "This is some text\n"
+ "over multiple lines\n"
\n
personaggio. Ad esempio, nel REPL: println("foo\n" + "bar")
stampa foo
e bar
su righe separate.
Ho usato un'estensione su String per ottenere stringhe multilinea evitando il bug di sospensione del compilatore. Ti permette anche di specificare un separatore in modo da poterlo usare un po 'come la funzione join di 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!"
enumerate(lines)
è oralines.enumerate()
joinWithSeparator
sostanzialmente non fa la stessa cosa? ["Hello", "World!"].joinWithSeparator(", ")
Questa è stata la prima cosa deludente di Swift che ho notato. Quasi tutti i linguaggi di scripting consentono stringhe multilinea.
C ++ 11 ha aggiunto valori letterali di stringa non elaborati che consentono di definire il proprio terminatore
C # ha i suoi @literals per stringhe multilinea.
Anche la semplice C e quindi il vecchio stile C ++ e Objective-C consentono la concatenazione semplicemente mettendo più letterali adiacenti, quindi le virgolette vengono compresse. Lo spazio bianco non conta quando lo fai in modo da poterli mettere su linee diverse (ma è necessario aggiungere le tue nuove linee):
const char* text = "This is some text\n"
"over multiple lines";
Poiché swift non sa che hai inserito il tuo testo su più righe, devo correggere l'esempio di Connor, in modo simile al mio esempio C, dichiarando esplicitamente la nuova riga:
var text:String = "This is some text \n" +
"over multiple lines"
Le stringhe multilinea sono disponibili a partire da Swift 4.0, ma ci sono alcune regole:
"""
."""
dovrebbe anche iniziare su una propria linea.A parte questo, sei a posto! Ecco un esempio:
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!
"""
Vedere le novità di Swift 4 per ulteriori informazioni.
Come sottolineato da litso, l'uso ripetuto di +
-Operator in un'espressione può portare a un blocco di XCode Beta (appena verificato con XCode 6 Beta 5): Xcode 6 Beta non compilato
Un'alternativa per le stringhe multilinea per ora è usare una matrice di stringhe e reduce
con +
:
var text = ["This is some text ",
"over multiple lines"].reduce("", +)
O, probabilmente più semplice, usando join
:
var text = "".join(["This is some text ",
"over multiple lines"])
Swift 4 ha risolto questo problema fornendo supporto letterale a più righe. Per iniziare a creare stringhe letterali aggiungere tre virgolette doppie ("" ") e premere il tasto Invio, dopo aver premuto il tasto Ritorno iniziare a scrivere stringhe con qualsiasi variabile, interruzioni di riga e virgolette doppie come se scrivessi nel blocco note o in qualsiasi editor di testo. Per terminare di nuovo il valore letterale della stringa di più righe, scrivere ("" ") in una nuova riga.
Vedi sotto esempio
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)
Swift:
@connor è la risposta giusta, ma se si desidera aggiungere righe in un'istruzione di stampa ciò che si sta cercando è \n
e / o \r
, queste sono chiamate sequenze di escape o caratteri di escape, questo è un collegamento alla documentazione Apple sull'argomento..
Esempio:
print("First line\nSecond Line\rThirdLine...")
Aggiungendo alla risposta @Connor, ci deve essere anche \ n. Ecco il codice rivisto:
var text:String = "This is some text \n" +
"over multiple lines"
L'esempio seguente mostra una continuazione su più righe, usando la parentesi come semplice soluzione per il bug Swift a partire da Xcode 6.2 Beta, dove si lamenta che l'espressione è troppo complessa per essere risolta in un tempo ragionevole e per considerare di scomporla in più piccola pezzi:
.
.
.
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)
.
.
.
Campione
var yourString = "first line \n second line \n third line"
Nel caso, non trovi l'operatore + adatto
Un approccio consiste nell'impostare il testo dell'etichetta su attributiText e aggiornare la variabile stringa per includere l'HTML per l'interruzione di riga (<br />
).
Per esempio:
var text:String = "This is some text<br />over multiple lines"
label.attributedText = text
Produzione:
This is some text
over multiple lines
Spero che questo ti aiuti!
String
valore (testo) alla NSAttributedString?
proprietà (label.attributedText).
Ecco uno snippet di codice per dividere una stringa per n caratteri separati su righe:
//: 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
}
}
}
}
Ho provato diversi modi, ma ho trovato una soluzione ancora migliore: basta usare un elemento "Visualizzazione testo". Il suo testo mostra automaticamente più righe! Trovato qui: UITextField più righe