स्विफ्ट - कई लाइनों पर विभाजित स्ट्रिंग


265

कैसे मैं नीचे के रूप में कई लाइनों पर एक स्ट्रिंग विभाजित कर सकता है?

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

स्वचालित रूप से एक बहु-पंक्ति स्ट्रिंग में लाइनों को परिवर्तित करने के लिए, इस थोड़े संबंधित धागे पर मेरा जवाब देखें आप स्विफ्ट में इस बहुस्तरीय स्ट्रिंग शाब्दिक मैक्रो को कैसे लागू कर सकते हैं?
होल्यारियो

जवाबों:


444

स्विफ्ट 4 में मल्टी-लाइन स्ट्रिंग शाब्दिक के लिए समर्थन शामिल है । नई सुर्खियों के अलावा वे अनपेक्षित उद्धरण भी शामिल कर सकते हैं।

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

स्विफ्ट के पुराने संस्करण आपको कई लाइनों में एक ही शाब्दिक की अनुमति नहीं देते हैं, लेकिन आप कई लाइनों में एक साथ शाब्दिक जोड़ सकते हैं:

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

2
समस्या w / वह दृष्टिकोण है जिसे आप आसानी से स्विफ्ट (Xcode 6.2 बीटा के रूप में) में कई 'निरंतर' लाइनों तक पहुंच सकते हैं, जहां यह शिकायत करता है कि "समय की उचित मात्रा में हल किया जाना जटिल है" और ब्रेकिंग पर विचार करने के लिए यह सरल अभिव्यक्तियों के लिए नीचे है। यह बदसूरत है लेकिन पूरा करने के लिए काफी आसान है, बस खंडों में लपेटें।
डेलाइट

8
समापन उद्धरण और + के बीच एक स्थान जोड़ने के लिए मत भूलना, अन्यथा आपको एक "'+' मिलेगा एक पोस्टऑफ्री अपरेंट्री ऑपरेटर नहीं है" त्रुटि
ओर्लिन जॉर्जीव

यह अभी भी काम करता है, लेकिन आपको \nचरित्र को मैन्युअल रूप से जोड़ना होगा । उदाहरण के लिए, REPL में: println("foo\n" + "bar")प्रिंट fooऔर barअलग-अलग लाइनों पर।
ब्रायन गेरस्टल

इसे Xcode 7 में तय किया जाना चाहिए "स्विफ्ट स्ट्रिंग शाब्दिकों का संयोजन, जिसमें कई लाइनें शामिल हैं, एक गारंटीकृत संकलन-समय अनुकूलन है, यहां तक ​​कि -one पर," adcdownload.apple.com/WWDC_2015/Xcode_7_beta/…
Koval

2
तार का उपयोग करने वाले एनम केस वैल्यू के लिए काम नहीं करता है :(
लार्स ब्लमबर्ग

32

कंपाइलर हैंगिंग बग से बचने के लिए मैंने मल्टीलाइन स्ट्रिंग्स प्राप्त करने के लिए स्ट्रिंग पर एक एक्सटेंशन का उपयोग किया। यह आपको एक विभाजक निर्दिष्ट करने की भी अनुमति देता है ताकि आप इसे थोड़ा सा उपयोग कर सकें जैसे कि पायथन के जॉइन फंक्शन

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
ये तरीके एकदम सही हैं। यहां तक ​​कि नवीनतम 1.2 स्विफ्ट रिलीज में लंबे शाब्दिक बहुत धीरे-धीरे संकलन करते हैं, और ये तरीके उस ओवरहेड से बचते हैं।
फतमान

2
स्विफ्ट 2 का उपयोग करने वाले किसी के लिए, enumerate(lines)अब हैlines.enumerate()
जेदीजा

2
@ मैंकनेल यह अच्छा है, लेकिन joinWithSeparatorअनिवार्य रूप से एक ही काम नहीं करता है? ["Hello", "World!"].joinWithSeparator(", ")
डैन लोवेनहेर्ज़

27

स्विफ्ट के बारे में यह पहली निराशाजनक बात थी जिस पर मैंने गौर किया। लगभग सभी स्क्रिप्टिंग भाषाएँ मल्टी-लाइन स्ट्रिंग्स के लिए अनुमति देती हैं।

C ++ 11 ने कच्चे स्ट्रिंग शाब्दिक जोड़े जो आपको अपने स्वयं के टर्मिनेटर को परिभाषित करने की अनुमति देते हैं

मल्टी लाइन स्ट्रिंग्स के लिए C # में इसके @ लीटरल्स हैं।

यहां तक ​​कि सादा सी और इस तरह पुराने जमाने के सी ++ और ऑब्जेक्टिव-सी समवर्ती कई शाब्दिक शब्दों को लगाकर सहमति के लिए अनुमति देते हैं, इसलिए उद्धरण ढह जाते हैं। जब आप ऐसा करते हैं तो व्हॉट्सएप की गिनती नहीं होती है, इसलिए आप उन्हें अलग-अलग पंक्तियों में रख सकते हैं (लेकिन अपनी खुद की नई सूची जोड़ने की आवश्यकता है):

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

जैसा कि स्विफ्ट को नहीं पता है कि आपने अपना पाठ कई लाइनों पर रखा है, मुझे कॉनर का नमूना ठीक करना है, मेरे सी नमूने के समान, नई पंक्ति को बताते हुए:

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

4
मुझे पूरा यकीन है कि इसमें सीमाएँ हैं। मैंने 13 लाइनों पर एक स्ट्रिंग को विभाजित करने की कोशिश की है (यह एक बहु पंक्ति जानकारी पाठ है)। न केवल यह संकलन समाप्त करने में विफल रहा, लेकिन इसने मेरे मैक को अपने घुटनों पर ला दिया। जैसा कि मैंने कहा, मैं स्पष्ट रूप से यह एक मुद्दा नहीं कह सकता, लेकिन सावधान रहना, प्रभाव बहुत बुरा है।
डेरेक नाइट

संकलन करने से पहले ही मैं कई बार दुर्घटनाग्रस्त हो चुका हूं। मुझे लगता है कि "SourceKitService" प्रक्रिया सिंटैक्स हाइलाइट और कोड पूरा होने के लिए जिम्मेदार है (मुझे लगता है) इस क्रैश के लिए भी जिम्मेदार है।
बजे पॉल ब्रूसकिनस्की

@DerekKnight यह संकलक बग है, न कि भाषा सीमा। यदि यह अभी भी बना रहता है, तो आपको एक रडार दायर करना चाहिए।
radex

@bluesm FYI करें: SourceKit एक अलग प्रक्रिया है, इसलिए यह Xcode को क्रैश नहीं कर सकता है। यह वाक्य रचना हाइलाइटिंग और कोड पूरा करने, सही करने के लिए करता है, लेकिन इस समय, संकलन खुद Xcode की प्रक्रिया में रहता है - यही कारण है कि एक कंपाइलर बग कभी-कभी Xcode को अपने साथ ले जाता है :(
radex

17

मल्टी-लाइन स्ट्रिंग्स स्विफ्ट 4.0 के रूप में संभव हैं, लेकिन कुछ नियम हैं:

  1. आपको तीन डबल कोट्स के साथ अपने स्ट्रिंग्स को शुरू करने और समाप्त करने की आवश्यकता है """
  2. आपकी स्ट्रिंग सामग्री अपनी लाइन पर शुरू होनी चाहिए।
  3. समाप्ति """भी अपनी लाइन पर शुरू होनी चाहिए।

इसके अलावा, आप जाने के लिए अच्छे हैं! यहाँ एक उदाहरण है:

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

अधिक जानकारी के लिए देखें स्विफ्ट 4 में क्या नया है


दुर्भाग्य से यह एक Xcode 8.3.3 प्लेग्राउंड में काम नहीं करता है। मुझे एक "unterminated string" त्रुटि मिलती है।
जेम्स फोस्टर

जैसा कि मैंने कहा, स्विफ्ट 4 में यह फीचर नया है - या तो स्विफ्ट 4 टूलचैन को Xcode 8.3.3 में स्थापित करें या Xcode 9. को इंस्टॉल करें
TwoStraws

16

जैसा कि +लिटूस द्वारा बताया गया है, एक अभिव्यक्ति में बार-बार इस्तेमाल होने वाले XCode Beta हैंग हो सकते हैं (सिर्फ XCode 6 Beta 5 के साथ जांचा गया): Xcode 6 Beta संकलन नहीं

अभी के लिए मल्टीलाइन स्ट्रिंग्स का एक विकल्प स्ट्रिंग्स की एक सरणी का उपयोग करना है और reduceइसके साथ +:

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

या, यकीनन सरल, का उपयोग कर join:

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

कम संस्करण ने मेरे लिए बीटा 6 पर काम किया, लेकिन जुड़ने ने एक अपवाद फेंक दिया।
ट्रिस्टन वार्नर-स्मिथ

9

स्विफ्ट 4 ने मल्टी लाइन स्ट्रिंग शाब्दिक समर्थन देकर इस मुद्दे को संबोधित किया है। स्टार्ट स्ट्रिंग शाब्दिक तीन दोहरे उद्धरण चिह्नों ("") को जोड़ें और वापसी कुंजी दबाएं, किसी भी चर के साथ कुंजी लेखन स्ट्रिंग शुरू करने के बाद, लाइन ब्रेक और डबल उद्धरण बस जैसे आप नोटपैड या किसी पाठ संपादक में लिखते हैं। बहु पंक्ति स्ट्रिंग शाब्दिक को फिर से नई पंक्ति में ("") लिखें।

नीचे उदाहरण देखें

     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

स्विफ्ट:

@connor सही उत्तर है, लेकिन यदि आप एक प्रिंट स्टेटमेंट में लाइनें जोड़ना चाहते हैं जो आप देख रहे हैं \nऔर / या \r, इन्हें एस्केप सीक्वेंस या एस्केप्ड कैरेक्टर कहा जाता है, तो यह विषय पर Apple प्रलेखन की एक कड़ी है।

उदाहरण:

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

6
यह वह नहीं है जो कोई चाहता है। हम स्ट्रिंग कोडरों के लिए स्रोत कोड में लाइन रैप्स करने में सक्षम होना चाहते हैं , न कि (आवश्यक) प्रदान किए गए आउटपुट में लाइन ब्रेक होना चाहिए । मुझे लगता है कि मूल प्रश्न में यह बहुत स्पष्ट था। सकारात्मक स्कोर वाले लोग स्पष्ट रूप से समझ गए हैं। नकारात्मक अंक वाले लोग स्पष्ट रूप से नहीं थे।
ArtOfWarfare 20

5
@ArtOfWarfare यह उत्तर है जिसकी मुझे तलाश थी और "नई लाइन स्विफ्ट स्ट्रिंग" की खोज करते समय यह पृष्ठ शीर्ष परिणाम था। जाहिर है, यह उतना स्पष्ट नहीं है जितना आप कहते हैं।
जॉन आर पेरी

4

@ उत्तर में जोड़कर, वहाँ भी \ n होना चाहिए। यहाँ संशोधित कोड है:

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

3

निम्न उदाहरण में एक बहु-लाइन निरंतरता को दर्शाया गया है, जो स्विफ्ट बग के लिए एक्सोड 6.2 बीटा के रूप में एक साधारण वर्कअराउंड के रूप में कोष्ठक का उपयोग करता है, जहां यह शिकायत करता है कि अभिव्यक्ति उचित मात्रा में समय पर हल करने के लिए बहुत जटिल है, और इसे छोटा करने पर विचार करने के लिए। टुकड़े:

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

दूसरा तरीका यदि आप कुछ पूर्वनिर्धारित पाठ के साथ एक स्ट्रिंग चर का उपयोग करना चाहते हैं,

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

0

आप एंट्री के लिए यूनिकोड समान का उपयोग कर सकते हैं या \nउन्हें आपके स्ट्रिंग के अंदर लागू कर सकते हैं। उदाहरण के लिए \u{0085}:।



0

एक दृष्टिकोण एक्टीवेटेड टेक्स्ट लेबल को सेट करना है और लाइन ब्रेक के लिए HTML को शामिल करने के लिए स्ट्रिंग चर को अपडेट करना है (<br /> )।

उदाहरण के लिए:

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

आउटपुट:

This is some text
over multiple lines

उम्मीद है की यह मदद करेगा!


आप प्रॉपर्टी (लेबल.attributedText) Stringको मान (टेक्स्ट) असाइन नहीं कर सकते NSAttributedString?
मैक्सिमे आशुरोव 12

0

यहां लाइनों द्वारा अलग n वर्णों द्वारा स्ट्रिंग को विभाजित करने के लिए एक कोड स्निपेट दिया गया है:

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

मैंने कई तरीकों की कोशिश की लेकिन एक और भी बेहतर समाधान मिला: बस एक "टेक्स्ट व्यू" तत्व का उपयोग करें। यह पाठ स्वचालित रूप से कई लाइनें दिखाता है! यहां पाया गया: UITextField कई लाइनें


(जैसा कि आप जानते हैं, डाउनवोट्स शायद इसलिए हैं क्योंकि प्रश्न कोड में प्रारूपण के बारे में था, यूआई में नहीं ... और आपके उत्तर में कोड नमूना प्रदान करना संभवतः इसे और अधिक स्पष्ट बना देगा)
benc
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.