সুইফট - একাধিক লাইনের উপরে স্ট্রিট বিভক্ত করুন


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
সমস্যাটি ডাব্লু / এ পদ্ধতির আপনি সহজেই সুইফটে (এক্সকোড .2.২ বিটা হিসাবে) খুব বেশি 'অব্যাহত' রেখায় পৌঁছাতে পারেন, যেখানে এটি অভিযোগ করে যে "যুক্তিসঙ্গত সময়ে সমাধান করা খুব জটিল" এবং ব্রেকিং বিবেচনা করার জন্য এটি সহজ মত প্রকাশের। এটি কুৎসিত তবে এটি সম্পাদন করা যথেষ্ট সহজ, প্যারেন্সে কেবল বিভাগগুলি মোড়ানো।
0-02

8
সমাপনী উদ্ধৃতি এবং + এর মধ্যে একটি স্থান যুক্ত করতে ভুলবেন না, অন্যথায় আপনি "'+' পোস্টফিক্স অ্যানারি অপারেটর নন" ত্রুটি
অরলিন জর্জিভ

এটি এখনও কাজ করে তবে আপনাকে \nচরিত্রটি ম্যানুয়ালি যোগ করতে হবে । উদাহরণস্বরূপ, REPL এ: println("foo\n" + "bar")প্রিন্ট fooএবং barপৃথক লাইনে।
ব্রায়ান জারস্ট

এটি XCode সংশোধন করা উচিত 7 "সুইফট সংযুক্তকরণ স্ট্রিং লিটারেল, একাধিক লাইন জুড়ে সহ, এমনকি এ -Onone, একটি নিশ্চিত কম্পাইল-টাইম অপ্টিমাইজেশান হয়।" Adcdownload.apple.com/WWDC_2015/Xcode_7_beta/...
Kostiantyn 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 সুইফ্ট রিলিজে দীর্ঘ আক্ষরিক খুব ধীরে ধীরে সংকলন করা হয় এবং এই পদ্ধতিগুলি সেই ওভারহেড এড়িয়ে চলে avoid
ফাতেমন

2
যে কেউ সুইফট 2 ব্যবহার করছেন তার enumerate(lines)জন্য এখনlines.enumerate()
জেদিদজা

2
@ এমকোর্নেল এটি দুর্দান্ত, তবে joinWithSeparatorমূলত একই জিনিসটি করেন না ? ["Hello", "World!"].joinWithSeparator(", ")
ড্যান লোয়েহের্জে

27

এটি সুইফট সম্পর্কে প্রথম হতাশাব্যঞ্জক যা আমি লক্ষ্য করেছি। প্রায় সমস্ত স্ক্রিপ্টিং ভাষা একাধিক-লাইনের স্ট্রিংয়ের অনুমতি দেয়।

সি ++ 11 টি কাঁচা স্ট্রিং লিটারেল যুক্ত করেছে যা আপনাকে আপনার নিজের টার্মিনেটর সংজ্ঞায়িত করতে দেয়

সি # এর মাল্টি-লাইন স্ট্রিংয়ের জন্য @ লিটারেলগুলি রয়েছে ।

এমনকি সরল সি এবং এইভাবে পুরানো ধাঁচের সি ++ এবং উদ্দেশ্য-সি কেবল একাধিক লিটারাল সংলগ্ন করে কনকেন্টেশন করার অনুমতি দেয়, সুতরাং উদ্ধৃতিগুলি ভেঙে যায়। হোয়াইটস্পেস এমনটি করার সময় গণনা করে না যাতে আপনি এগুলিকে বিভিন্ন লাইনে লাগাতে পারেন (তবে আপনার নিজের নিজস্ব নতুন লাইন যুক্ত করা দরকার):

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

যেহেতু সুইফ্ট জানে না যে আপনি আপনার পাঠ্যকে একাধিক লাইনের উপরে রেখেছেন, তাই আমি আমার সি নমুনার মতো একইভাবে সংযোজকের নমুনা ঠিক করতে হবে, স্পষ্টভাবে নিউলাইনটি উল্লেখ করে:

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

4
আমি নিশ্চিত যে এর সীমাবদ্ধতা আছে। আমি 13 টি লাইনের উপরে একটি স্ট্রিংকে বিভক্ত করার চেষ্টা করেছি (এটি একটি মাল্টি লাইন তথ্য পাঠ্য)। এটি কেবল সংকলন শেষ করতেই ব্যর্থ হয়েছিল তা নয়, এটি আমার ম্যাকটিকে হাঁটুতে এনেছে। আমি যেমন বলেছি, আমি স্পষ্টত বলতে পারি না এটি একটি সমস্যা, তবে সতর্ক থাকুন, প্রভাবটি খুব খারাপ।
ডেরেক নাইট

সংকলনের আগেও আমি একাধিকবার ক্র্যাশ করেছি। আমি মনে করি সিনট্যাক্স হাইলাইট এবং কোড সমাপ্তির জন্য দায়ী "সোর্সকিট সার্ভিস" প্রক্রিয়া (আমি মনে করি) এই ক্র্যাশগুলির জন্যও দায়ী।
পল ব্রুউজাইস্কি

@ ডেরেকনাটাইট এটি একটি সংকলক বাগ, কোনও ভাষার সীমাবদ্ধতা নয়। এটি এখনও অব্যাহত থাকলে আপনার একটি রাডার ফাইল করা উচিত।
রেডেক্স

@ ব্লুজ এফওয়াইআই: সোর্সকিট একটি পৃথক প্রক্রিয়া, তাই এটি এক্সকোড ক্রাশ করতে পারে না। এটি সিনট্যাক্স হাইলাইটিং এবং কোড সমাপ্তি, সঠিক, তবে এই মুহুর্তে সংকলনটি নিজেই এক্সকোডের প্রক্রিয়ায় বাস করে - এজন্যই একটি সংকলক বাগ কখনও কখনও নিজের সাথে Xcode নামিয়ে নেয় :(
রাডেক্স

17

একাধিক-লাইনের স্ট্রিংগুলি সুইফট ৪.০ হিসাবে সম্ভব, তবে কিছু বিধি রয়েছে:

  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 এ নতুন কী দেখুন ।


দুর্ভাগ্যক্রমে এটি কোনও এক্সকোড 8.3.3 খেলার মাঠে কাজ করে না। আমি একটি "নির্বিঘ্নিত স্ট্রিং" ত্রুটি পেয়েছি।
জেমস ফস্টার

আমি যেমন বলেছি, এই বৈশিষ্ট্যটি সুইফট 4-এ নতুন either হয়
এক্সকোড

16

+লিটসো দ্বারা নির্দেশিত হিসাবে, একই অভিব্যক্তিতে অপারেটরটির বারবার ব্যবহার এক্সকোড বিটা ঝুলতে পারে (কেবলমাত্র এক্সকোড 6 বিটা 5 দিয়ে পরীক্ষা করা হয়েছে): এক্সকোড 6 বিটা সংকলন করছে না

আপাতত মাল্টলাইন স্ট্রিংগুলির বিকল্প হ'ল স্ট্রিংগুলির অ্যারে ব্যবহার করা এবং 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

সুইফট:

@ কনর সঠিক উত্তর, তবে আপনি যদি মুদ্রণ বিবৃতিতে লাইন যুক্ত করতে চান এবং যেগুলি \nএবং / বা \r, এগুলিকে এস্কেপ সিকোয়েন্সস বা পালিত অক্ষর বলা হয়, এটি এই বিষয়টিতে অ্যাপল ডকুমেন্টেশনের একটি লিঙ্ক।

উদাহরণ:

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

6
এটা কেউ চায় না আমরা স্ট্রিং লিটারালগুলির জন্য সোর্স কোডে লাইন রে্যাপ রাখতে সক্ষম হতে চাই , (প্রয়োজনীয়ভাবে) রেন্ডার আউটপুটটিতে লাইন ব্রেক নেই । এটি মূল প্রশ্নে বেশ পরিষ্কার ছিল, আমার ধারণা। ইতিবাচক স্কোর সহ লোকেরা স্পষ্টতই বোঝে। নেতিবাচক স্কোরযুক্ত লোকেরা অবশ্যই তা করেন নি।
আর্টঅফ ওয়ারফেয়ার

5
@ আর্টঅফ ওয়ারফেয়ার এই উত্তরটি আমি খুঁজছিলাম এবং "নতুন লাইন সুইফ্ট স্ট্রিং" অনুসন্ধান করার সময় এই পৃষ্ঠাটি শীর্ষ ফল ছিল। স্পষ্টতই, আপনি যা বলছেন তেমন স্পষ্ট নয়।
জন আর পেরি 15


3

নিম্নলিখিত উদাহরণটিতে এক্সকোড .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

একটি পদ্ধতি হ'ল এইচটিএমএলকে লাইন ব্রেকের জন্য অন্তর্ভুক্ত করার জন্য লেবেল পাঠ্যকে অ্যাট্রিবিউটটেক্সটে সেট করা এবং স্ট্রিং ভেরিয়েবল আপডেট করা (<br /> ) ।

উদাহরণ স্বরূপ:

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

আউটপুট:

This is some text
over multiple lines

আশাকরি এটা সাহায্য করবে!


আপনি সম্পত্তি (লেবেল.ট্রিবিউটেড Stringটেক্সট) এর মান (পাঠ্য) নির্ধারণ করতে পারবেন না NSAttributedString?
ম্যাক্সিমিম আশুরভ

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

আমি বেশ কয়েকটি উপায়ে চেষ্টা করেছি তবে এর থেকে আরও ভাল সমাধান পেয়েছি: কেবলমাত্র "টেক্সট ভিউ" উপাদানটি ব্যবহার করুন। এটি পাঠ্যটি স্বয়ংক্রিয়ভাবে একাধিক লাইন দেখায়! এখানে পাওয়া গেছে: ইউআইটিেক্সটফিল্ড একাধিক লাইন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.