Wie kann ich eine Zeichenfolge über mehrere Zeilen wie unten aufteilen?
var text:String = "This is some text
over multiple lines"
Wie kann ich eine Zeichenfolge über mehrere Zeilen wie unten aufteilen?
var text:String = "This is some text
over multiple lines"
Antworten:
Swift 4 unterstützt mehrzeilige String-Literale . Neben Zeilenumbrüchen können sie auch Anführungszeichen enthalten.
var text = """
This is some text
over multiple lines
"""
In älteren Versionen von Swift können Sie kein einzelnes Literal über mehrere Zeilen hinweg erstellen, aber Sie können Literale über mehrere Zeilen hinweg hinzufügen:
var text = "This is some text\n"
+ "over multiple lines\n"
\n
Zeichen manuell hinzufügen . Zum Beispiel in der REPL: println("foo\n" + "bar")
druckt foo
und bar
in separaten Zeilen.
Ich habe eine Erweiterung für String verwendet, um mehrzeilige Strings zu erzielen und gleichzeitig den Fehler beim Hängen des Compilers zu vermeiden. Außerdem können Sie ein Trennzeichen angeben, damit Sie es ähnlich wie die Join-Funktion von Python verwenden können
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)
ist jetztlines.enumerate()
joinWithSeparator
Wesentlichen das Gleiche? ["Hello", "World!"].joinWithSeparator(", ")
Dies war die erste enttäuschende Sache an Swift, die mir auffiel. Fast alle Skriptsprachen ermöglichen mehrzeilige Zeichenfolgen.
In C ++ 11 wurden Raw-String-Literale hinzugefügt, mit denen Sie Ihren eigenen Terminator definieren können
C # hat seine @ Literale für mehrzeilige Zeichenfolgen.
Sogar einfaches C und damit altmodisches C ++ und Objective-C ermöglichen eine Konzentration, indem einfach mehrere Literale nebeneinander platziert werden, sodass Anführungszeichen reduziert werden. Whitespace zählt dabei nicht, sodass Sie sie in verschiedene Zeilen einfügen können (Sie müssen jedoch Ihre eigenen Zeilenumbrüche hinzufügen):
const char* text = "This is some text\n"
"over multiple lines";
Da Swift nicht weiß, dass Sie Ihren Text über mehrere Zeilen geschrieben haben, muss ich das Connor-Beispiel ähnlich wie mein C-Beispiel korrigieren und die neue Zeile explizit angeben:
var text:String = "This is some text \n" +
"over multiple lines"
Ab Swift 4.0 sind mehrzeilige Zeichenfolgen möglich, es gibt jedoch einige Regeln:
"""
."""
sollte auch in einer eigenen Zeile beginnen.Davon abgesehen können Sie loslegen! Hier ist ein Beispiel:
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!
"""
Sehen Sie, was in Swift 4 ist neu für weitere Informationen.
Wie von litso hervorgehoben, kann die wiederholte Verwendung des +
-Operators in einem Ausdruck dazu führen, dass XCode Beta hängt (nur mit XCode 6 Beta 5 überprüft): Xcode 6 Beta wird nicht kompiliert
Eine Alternative für mehrzeilige Zeichenfolgen besteht derzeit darin, ein Array von Zeichenfolgen zu verwenden, und zwar reduce
mit +
:
var text = ["This is some text ",
"over multiple lines"].reduce("", +)
Oder, wohl einfacher, mit join
:
var text = "".join(["This is some text ",
"over multiple lines"])
Swift 4 hat dieses Problem behoben, indem es mehrzeiliges Zeichenfolgenliteral unterstützt. Um mit dem Zeichenfolgenliteral zu beginnen, fügen Sie drei doppelte Anführungszeichen (”” ”) hinzu und drücken Sie die Eingabetaste. Nachdem Sie die Eingabetaste gedrückt haben, schreiben Sie Zeichenfolgen mit beliebigen Variablen, Zeilenumbrüchen und doppelten Anführungszeichen als würden Sie in Notizblock oder einem beliebigen Texteditor schreiben. Um das mehrzeilige Zeichenfolgenliteral erneut zu beenden, schreiben Sie (”” ”) in eine neue Zeile.
Siehe Beispiel unten
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)
Schnell:
@connor ist die richtige Antwort. Wenn Sie jedoch Zeilen in einer Druckanweisung hinzufügen möchten, nach denen Sie suchen, \n
und / oder \r
diese als Escape-Sequenzen oder Escap-Zeichen bezeichnet werden, ist dies ein Link zur Apple-Dokumentation zu diesem Thema. .
Beispiel:
print("First line\nSecond Line\rThirdLine...")
Zum Hinzufügen zur @ Connor-Antwort muss auch \ n vorhanden sein. Hier ist überarbeiteter Code:
var text:String = "This is some text \n" +
"over multiple lines"
Das folgende Beispiel zeigt eine mehrzeilige Fortsetzung, wobei Klammern als einfache Problemumgehung für den Swift-Fehler ab Xcode 6.2 Beta verwendet werden. Dabei wird beanstandet, dass der Ausdruck zu komplex ist, um ihn in angemessener Zeit aufzulösen und in kleinere Teile zu zerlegen Stücke:
.
.
.
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)
.
.
.
Stichprobe
var yourString = "first line \n second line \n third line"
Falls Sie den Operator + nicht für geeignet halten
Ein Ansatz besteht darin, den Beschriftungstext auf attributedText zu setzen und die Zeichenfolgenvariable so zu aktualisieren, dass sie den HTML-Code für Zeilenumbruch ( <br />
) enthält.
Beispielsweise:
var text:String = "This is some text<br />over multiple lines"
label.attributedText = text
Ausgabe:
This is some text
over multiple lines
Hoffe das hilft!
String
der NSAttributedString?
Eigenschaft (label.attributedText) keinen Wert (Text) zuweisen.
Hier ist ein Code-Snippet zum Teilen einer Zeichenfolge durch n Zeichen, die über Zeilen getrennt sind:
//: 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
}
}
}
}
Ich habe verschiedene Möglichkeiten ausprobiert, aber eine noch bessere Lösung gefunden: Verwenden Sie einfach ein "Textansicht" -Element. Der Text wird automatisch in mehreren Zeilen angezeigt! Hier gefunden: UITextField mehrere Zeilen