Swift - Dizeyi birden çok satıra böl


Yanıtlar:


444

Swift 4, çok satırlı dize değişmez değerleri için destek içerir . Yeni satırlara ek olarak çıkış karakterleri de içermeyebilirler.

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

Swift'in daha eski sürümleri, birden çok satırda tek bir hazır bilgi bilgisine sahip olmanıza izin vermez, ancak birden çok satır üzerine birlikte hazır bilgi ekleyebilirsiniz:

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

2
Bu yaklaşımla ilgili sorun, Swift'te (Xcode 6.2 beta sürümünden) çok fazla sayıda 'devam eden' çizgiye kolayca erişebilmenizdir, burada ifadenin "makul bir süre içinde çözülemeyecek kadar karmaşık" olduğundan ve kırılmayı düşünmekten şikayet eder daha basit ifadelere indirgeyin. Bu çirkin ama başarmak için yeterince kolay, sadece bölümleri parenlere sarın.
clearlight

8
Kapanış teklifi ile + arasına boşluk eklemeyi unutmayın, aksi takdirde bir "'+' postfix tekli operatör değildir" hatası alırsınız
Orlin Georgiev

Bu hala işe yarıyor, ancak \nkarakteri manuel olarak eklemeniz gerekiyor . Örneğin, REPL içinde: println("foo\n" + "bar")baskılar foove barayrı satırlarda.
Brian Gerstle

Xcode 7'de düzeltilmelidir "Birden fazla satırda dahil olmak üzere Swift dize değişmezlerinin birleştirilmesi, -Onone'da bile garantili bir derleme zamanı optimizasyonudur." - adcdownload.apple.com/WWDC_2015/Xcode_7_beta/…
Kostiantyn Koval

2
Dizeleri kullanan numaralandırma vaka değerleri için çalışmaz :(
Lars Blumberg

32

Derleyici asılı hata kaçınarak çok satırlı dizeleri elde etmek için String bir uzantı kullandım. Ayrıca, bir ayırıcı belirtmenize izin verir, böylece onu Python'un birleştirme işlevi gibi kullanabilirsiniz

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!"

1
Bu yöntemler mükemmel. En son 1.2 Swift sürümünde bile uzun değişmezler çok yavaş derleniyor ve bu yöntemler bu yükü engelliyor.
phatmann

2
Swift 2 kullanan herkes için enumerate(lines), şimdilines.enumerate()
Jedidja

2
@mcornell Bu güzel, ama joinWithSeparatoraslında aynı şeyi yapmıyor mu? ["Hello", "World!"].joinWithSeparator(", ")
Dan Loewenherz

27

Bu Swift ile ilgili fark ettiğim ilk hayal kırıklığı yaratan şeydi. Hemen hemen tüm komut dosyası dilleri çok satırlı dizelere izin verir.

C ++ 11 , kendi terminatörünüzü tanımlamanıza izin veren ham dize değişmezleri ekledi

C #, çok satırlı dizeler için @literals değerine sahiptir .

Düz C ve dolayısıyla eski moda C ++ ve Objective-C bile, birden çok değişmezi bitişik olarak koyarak birleşmeye izin verir, böylece tırnaklar daraltılır. Whitespace bunu yaptığınızda sayılmaz, böylece bunları farklı satırlara koyabilirsiniz (ancak kendi yeni satırlarınızı eklemeniz gerekir):

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

Swift, metninizi birden çok satıra koyduğunuzu bilmediğinden, C örneğime benzer şekilde, satırsonunu açıkça belirterek, konektörün örneğini düzeltmem gerekiyor:

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

4
Bu konuda sınırlamalar olduğundan eminim. 13 Satır (Bu çok satırlı bilgi metni) üzerinde bir dize bölme denedim. Sadece derlemeyi bitirmekle kalmadı, Mac'imi dizlerinin üstüne getirdi. Dediğim gibi, kategorik olarak bunun bir sorun olduğunu söyleyemem, ama dikkat, etki oldukça kötü.
Derek Knight

Derlemeden önce birden çok kez çöktüm. Ben sözdizimi vurgu ve kod tamamlanmasından (sanırım) sorumlu "SourceKitService" işlemi de bu çökmelerden sorumlu olduğunu düşünüyorum.
Paul Brewczynski

@DerekKnight Bu bir derleyici hatası, dil sınırlaması değil. Hala devam ederse, bir Radar dosyası açmalısınız.
radex

@bluesm FYI: SourceKit ayrı bir işlemdir, bu nedenle Xcode'u kilitleyemez. Sözdizimi vurgulama ve kod tamamlama, doğru, ancak şu anda, derlemenin kendisi
Xcode'un

17

Swift 4.0'dan itibaren çok satırlı dizeler mümkündür, ancak bazı kurallar vardır:

  1. Dizelerinizi üç çift tırnak işareti ile başlatmanız ve bitirmeniz gerekir """.
  2. Dize içeriğiniz kendi satırında başlamalıdır.
  3. Sonlandırma """da kendi satırında başlamalıdır.

Bunun dışında gitmek için iyi! İşte bir örnek:

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!
"""

Daha fazla bilgi için Swift 4'teki yeniliklere bakın .


Ne yazık ki bu bir Xcode 8.3.3 Oyun alanında çalışmaz. "Sonlandırılmamış dize" hatası alıyorum.
James Foster

Dediğim gibi, bu özellik Swift 4'te yeni - Xcode
8.3.3'e

16

Litso'nun işaret ettiği gibi, +bir ifadede -Operator'ın tekrar tekrar kullanılması XCode Beta askıya alınmasına neden olabilir (sadece XCode 6 Beta 5 ile kontrol edilir): Xcode 6 Beta derlenmiyor

Şimdilik çok satırlı dizeler için bir alternatif, bir dizi dizeyi kullanmaktır ve aşağıdakilerle reducebirlikte +:

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

Veya tartışmasız daha basit join:

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

İndirgeme sürümü beta 6'da benim için çalıştı, ancak katılma bir istisna attı.
Tristan Warner-Smith

9

Swift 4, Çok satırlı dize değişmez desteği vererek bu sorunu çözdü. Dize değişmezine başlamak için üç çift tırnak işareti (”” ”) ekleyin ve dönüş tuşuna basın, dönüş tuşuna bastıktan sonra herhangi bir değişken, satır kesmesi ve çift tırnak ile dizeleri yazmaya başlayın not defterinde veya herhangi bir metin düzenleyicide yazmak gibi. Çok satırlı dizgi hazır bilgisini sonlandırmak için yeni satıra (”” ”) tekrar yazın.

Aşağıdaki Örneğe Bakın

     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)

5

Swift:

@connor doğru cevaptır, ancak bir baskı ifadesine satırlar eklemek istiyorsanız, aradığınız şey \nve / veya \rbunlara Kaçış Dizileri veya Kaçan Karakterler denirse, bu konuyla ilgili Apple belgelerine bir bağlantıdır. .

Misal:

print("First line\nSecond Line\rThirdLine...")

6
Kimsenin istediği bu değil. Dize değişmezleri için kaynak kodunda satır kaydırmaları yapabilmek istiyoruz , (mutlaka) işlenen çıktıda satır sonları olmamak istiyoruz . Bence asıl soruda bu çok açıktı. Olumlu puanları olan insanlar açıkça anlaşılmıştır. Olumsuz puanları olan insanlar bunu yapamadı.
ArtOfWarfare

5
@ArtOfWarfare bu aradığım cevap ve "yeni satır hızlı dize" için bir arama yaparken bu sayfa en iyi sonuç oldu. Açıkçası, söylediğin kadar açık değil.
John R Perry

4

@Connor yanıtına eklenirken, \ n de olması gerekir. Düzeltilmiş kod:

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

3

Aşağıdaki örnek, parantezin Xcode 6.2 Beta sürümünden Swift hatası için basit bir geçici çözüm olarak kullanıldığı, ifadenin makul bir süre içinde çözülemeyecek kadar karmaşık olduğundan ve daha küçük bir parçaya bölündüğünü düşündüğünden çok satırlı bir devamını göstermektedir. adet:

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

0

Önceden tanımlanmış bazı metinlerle dize değişkeni kullanmak istiyorsanız,

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

0

Enter veya unicode eşitlerini kullanarak \nbunları dizenizin içine uygulayabilirsiniz. Örneğin: \u{0085}.


0

Örneklem

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

+ Operatörünü uygun bulamazsanız


0

Bir yaklaşım, etiket metnini attributedText'e ayarlamak ve dize değişkenini satır sonu HTML'sini içerecek şekilde güncellemektir<br /> ) .

Örneğin:

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

Çıktı:

This is some text
over multiple lines

Bu yardımcı olur umarım!


Özelliğe Stringdeğer (metin) atayamazsınız NSAttributedString?(label.attributedText).
Maxime Ashurov

0

Bir dizeyi satırlar halinde ayrılmış n karaktere bölmek için bir kod pasajı:

//: 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
            }
        }

    }
}

-3

Birkaç yol denedim ama daha iyi bir çözüm buldum: Sadece bir "Metin Görünümü" öğesi kullanın. Metin otomatik olarak birden fazla satır gösterir! Burada bulundu: UITextField birden fazla satır


(sadece bildiğiniz gibi, aşağı oylar muhtemelen sorunun kullanıcı arayüzünde değil kodda biçimlendirmeyle ilgili olması ve cevabınızda bir kod örneği sağlamak muhtemelen bunu daha belirgin hale getirecektir)
benc
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.