Jak mogę podzielić ciąg na wiele linii, takich jak poniżej?
var text:String = "This is some text
over multiple lines"
Jak mogę podzielić ciąg na wiele linii, takich jak poniżej?
var text:String = "This is some text
over multiple lines"
Odpowiedzi:
Swift 4 obsługuje wieloliniowe literały łańcuchowe . Oprócz znaków nowej linii mogą także zawierać cytaty bez ukrycia.
var text = """
This is some text
over multiple lines
"""
Starsze wersje Swift nie pozwalają mieć jednego literału w wielu wierszach, ale można dodawać razem literały w wielu wierszach:
var text = "This is some text\n"
+ "over multiple lines\n"
\n
postać. Na przykład w REPL: println("foo\n" + "bar")
drukuje foo
i bar
na osobnych wierszach.
Użyłem rozszerzenia String, aby uzyskać ciągi wielowierszowe, unikając błędu zawieszenia kompilatora. Pozwala także określić separator, dzięki czemu można go używać trochę jak funkcji łączenia Pythona
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)
jest terazlines.enumerate()
joinWithSeparator
czy zasadniczo nie robi tego samego? ["Hello", "World!"].joinWithSeparator(", ")
To była pierwsza rozczarowująca rzecz w Swift, którą zauważyłem. Prawie wszystkie języki skryptowe pozwalają na wieloliniowe ciągi znaków.
C ++ 11 dodał nieprzetworzone ciągi literałów, które pozwalają zdefiniować własny terminator
C # ma swoje @literals dla ciągów wieloliniowych.
Nawet zwykły C, a więc staromodny C ++ i Objective-C pozwalają na konkatentację po prostu poprzez umieszczenie wielu literałów obok siebie, więc cytaty są zwinięte. Białe znaki nie liczą się, gdy to robisz, więc możesz umieścić je w różnych wierszach (ale musisz dodać własne nowe linie):
const char* text = "This is some text\n"
"over multiple lines";
Ponieważ swift nie wie, że umieściłeś tekst w wielu wierszach, muszę naprawić próbkę Connora, podobnie jak moja próbka C, wyraźnie zaznaczając nowy wiersz:
var text:String = "This is some text \n" +
"over multiple lines"
Ciągi wielowierszowe są możliwe od Swift 4.0, ale istnieją pewne zasady:
"""
."""
powinno również rozpocząć się na jego własnej linii.Poza tym możesz iść! Oto przykład:
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!
"""
Aby uzyskać więcej informacji, zobacz, co nowego w Swift 4 .
Jak wskazał litso, wielokrotne użycie -Operatora +
w jednym wyrażeniu może doprowadzić do zawieszenia się XCode Beta (właśnie sprawdzone za pomocą XCode 6 Beta 5): Xcode 6 Beta nie kompiluje się
Alternatywą dla multilinii strun na razie jest użycie tablicę łańcuchów i reduce
to z +
:
var text = ["This is some text ",
"over multiple lines"].reduce("", +)
Lub, prawdopodobnie łatwiej, używając join
:
var text = "".join(["This is some text ",
"over multiple lines"])
Swift 4 rozwiązał ten problem, zapewniając obsługę literału ciągów w wielu wierszach. Aby rozpocząć literał ciągów, dodaj trzy znaki podwójnego cudzysłowu („” ”) i naciśnij klawisz powrotu. Po naciśnięciu klawisza powrotu zacznij pisać ciągi znaków z dowolnymi zmiennymi, podziałami wierszy i podwójnymi cudzysłowami tak jak piszesz w notatniku lub dowolnym edytorze tekstu. Aby zakończyć dosłowny ciąg wieloliniowy, ponownie napisz (”” ”) w nowym wierszu.
Zobacz poniższy przykład
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)
Szybki:
@connor jest prawidłową odpowiedzią, ale jeśli chcesz dodać wiersze w instrukcji drukowania, to czego szukasz \n
i / lub \r
, są to tak zwane sekwencje specjalne lub znaki ucieczki, jest to link do dokumentacji Apple na ten temat. .
Przykład:
print("First line\nSecond Line\rThirdLine...")
Dodając do odpowiedzi @Connor, należy również \ n. Oto poprawiony kod:
var text:String = "This is some text \n" +
"over multiple lines"
Poniższy przykład przedstawia kontynuację wieloliniową, używając nawiasu jako prostego obejścia błędu Swift od wersji Xcode 6.2 Beta, w którym narzeka, że wyrażenie jest zbyt złożone, aby można je było rozwiązać w rozsądnym czasie i rozważyć podzielenie go na mniejsze sztuk:
.
.
.
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)
.
.
.
Próba
var yourString = "first line \n second line \n third line"
W przypadku, gdy operator + nie jest odpowiedni
Jednym z podejść jest ustawienie tekstu etykiety na atrybut atrybutText i zaktualizowanie zmiennej string w celu dołączenia kodu HTML do podziału wiersza (<br />
).
Na przykład:
var text:String = "This is some text<br />over multiple lines"
label.attributedText = text
Wynik:
This is some text
over multiple lines
Mam nadzieję że to pomoże!
String
wartości (tekstu) do NSAttributedString?
właściwości (label.attributeText).
Oto fragment kodu dzielący ciąg znaków na n znaków rozdzielonych liniami:
//: 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
}
}
}
}
Wypróbowałem kilka sposobów, ale znalazłem jeszcze lepsze rozwiązanie: wystarczy użyć elementu „Widok tekstu”. Jego tekst wyświetla wiele linii automatycznie! Znaleziono tutaj: UITextField wiele linii