मैं एक स्विफ्ट ऐरे को स्ट्रिंग में कैसे बदल सकता हूं?


353

मुझे पता है कि प्रोग्रामेटिकली कैसे करना है, लेकिन मुझे यकीन है कि एक अंतर्निहित तरीका है ...

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


3
स्विफ्ट 4: array.description या यदि आप एक कस्टम विभाजक चाहते हैंarray.joined(separator: ",")
जोनाथन सोलोरज़ानो

जवाबों:


697

यदि सरणी में तार हैं, तो आप String's joinविधि का उपयोग कर सकते हैं :

var array = ["1", "2", "3"]

let stringRepresentation = "-".join(array) // "1-2-3"

में स्विफ्ट 2 :

var array = ["1", "2", "3"]

let stringRepresentation = array.joinWithSeparator("-") // "1-2-3"

यदि आप एक विशिष्ट विभाजक (हाइपेन, ब्लैंक, कॉमा, आदि) का उपयोग करना चाहते हैं तो यह उपयोगी हो सकता है।

अन्यथा आप बस descriptionसंपत्ति का उपयोग कर सकते हैं, जो सरणी का एक स्ट्रिंग प्रतिनिधित्व लौटाता है:

let stringRepresentation = [1, 2, 3].description // "[1, 2, 3]"

संकेत: Printableप्रोटोकॉल को लागू करने वाली किसी भी वस्तु में एक descriptionसंपत्ति होती है। यदि आप उस प्रोटोकॉल को अपनी कक्षाओं / संरचनाओं में अपनाते हैं, तो आप उन्हें प्रिंट के अनुकूल भी बनाते हैं

में स्विफ्ट 3

  • joinjoinedउदाहरण बन जाता है[nil, "1", "2"].flatMap({$0}).joined()
  • joinWithSeparatorबन जाता है joined(separator:)(केवल स्ट्रिंग्स के एरे के लिए उपलब्ध)

में स्विफ्ट 4

var array = ["1", "2", "3"]
array.joined(separator:"-")

2
@Andrej: यह 1.2 और 2.0 दोनों पर काम करता है। क्या आप तार की एक सरणी का उपयोग कर रहे हैं?
एंटोनियो

1
एंटोनियो, माफ करना, मेरा बुरा। मैं अपने सरणी के साथ एक मुद्दा था। अब मैं आपके समाधान कार्यों की पुष्टि कर सकता हूं। :)
Andrej

12
"-".join(array)अब स्विफ्ट 2, एक्सकोड 7 बीटा 6 में उपलब्ध नहीं है, का उपयोग करने का प्रयास करेंarray.joinWithSeparator("-")
हैरी एनजी

87
joinWithSeparatorकेवल तार के लिए उपलब्ध है। यदि आपके पास अन्य वस्तुओं की सरणी है, तो mapपहले का उपयोग करें । उदाहरण के लिए,[1, 2, 3].map({"\($0)"}).joinWithSeparator(",")
दिमित्री

3
@Dmitry स्ट्रिंग में रूपांतरण के लिए स्ट्रिंग इंटरपोलेशन का उपयोग न करें। स्ट्रिंग
अलेक्जेंडर

130

अपनी आवश्यकताओं के अनुसार, स्विफ्ट 5 के साथ, आप अपनी समस्या को हल करने के लिए निम्नलिखित में से एक खेल का मैदान नमूना कोड चुन सकते हैं।


बिना किसी विभाजक के साथ Characterएस की एक सरणी को मोड़ना String:

let characterArray: [Character] = ["J", "o", "h", "n"]
let string = String(characterArray)

print(string)
// prints "John"

बिना किसी विभाजक के साथ Stringएस की एक सरणी को मोड़ना String:

let stringArray = ["Bob", "Dan", "Bryan"]
let string = stringArray.joined(separator: "")

print(string) // prints: "BobDanBryan"

शब्दों के बीच एक विभाजक के साथ Stringएस की एक सरणी को मोड़ना String:

let stringArray = ["Bob", "Dan", "Bryan"]
let string = stringArray.joined(separator: " ")

print(string) // prints: "Bob Dan Bryan"

वर्णों के बीच विभाजक के साथ Stringएस की एक सरणी को मोड़ना String:

let stringArray = ["car", "bike", "boat"]
let characterArray = stringArray.flatMap { $0 }
let stringArray2 = characterArray.map { String($0) }
let string = stringArray2.joined(separator: ", ")

print(string) // prints: "c, a, r, b, i, k, e, b, o, a, t"

संख्याओं के बीच विभाजक के साथ Floats की एक सरणी को मोड़ना String:

let floatArray = [12, 14.6, 35]
let stringArray = floatArray.map { String($0) }
let string = stringArray.joined(separator: "-")

print(string)
// prints "12.0-14.6-35.0"

मेरे पास एक स्ट्रिंग है जो दिखता है: "[1,2,3]"। क्या इसे आसानी से एक सरणी [इंट] में परिवर्तित करने का कोई तरीका है? आसानी से। क्या।
user2363025

@ user2363025 uni JSON डिकोडर का उपयोग कर सकते हैं। try JSONDecoder().decode([Int].self, from: Data(string.utf8))
लियो डबस

48

joinWithSeparator()इसके बजाय स्विफ्ट 2.0 Xcode 7.0 बीटा 6 का उपयोग करता है join():

var array = ["1", "2", "3"]
let stringRepresentation = array.joinWithSeparator("-") // "1-2-3"

joinWithSeparator पर विस्तार के रूप में परिभाषित किया गया है SequenceType

extension SequenceType where Generator.Element == String {
    /// Interpose the `separator` between elements of `self`, then concatenate
    /// the result.  For example:
    ///
    ///     ["foo", "bar", "baz"].joinWithSeparator("-|-") // "foo-|-bar-|-baz"
    @warn_unused_result
    public func joinWithSeparator(separator: String) -> String
}



11

चूंकि किसी ने कमी का उल्लेख नहीं किया है, यहाँ यह है:

[0, 1, 1, 0].map {"\($0)"}.reduce("") {$0 + $1 } // "0110"

कार्यात्मक प्रोग्रामिंग की भावना में programming


3
चीजों को करने का अच्छा तरीका, धन्यवाद ... कमांड लाइन का एक छोटा अंत जोड़ना [0,1,1,0].map{"\($0)"}.reduce("",+):। 😉
XLE_22

@ XLE_22[0,1,1,0].map(String.init).joined()
लियो डबस

8

वैकल्पिक / गैर-वैकल्पिक स्ट्रिंग्स की एक सरणी को बदलने के लिए

//Array of optional Strings
let array : [String?] = ["1",nil,"2","3","4"]

//Separator String
let separator = ","

//flatMap skips the nil values and then joined combines the non nil elements with the separator
let joinedString = array.flatMap{ $0 }.joined(separator: separator)


//Use Compact map in case of **Swift 4**
    let joinedString = array.compactMap{ $0 }.joined(separator: separator

print(joinedString)

यहाँ फ्लैटपाइप , कॉम्पैक्टपॉइंट सरणी में शून्य मानों को छोड़ देता है और अन्य मानों को एक सम्मिलित स्ट्रिंग देने के लिए जोड़ देता है।


3
@YashBedi में स्विफ्ट 4 उपयोग हम compactMap के बजाय flatMap
एजेंट स्मिथ

"$" का क्या अर्थ है?
अगस्तो २

2
@ ऑगस्टो स्विफ्ट स्वचालित रूप से इनलाइन क्लोजर को शॉर्टहैंड तर्क नाम प्रदान करता है, जिसका उपयोग $ 0, $ 1, $ 2 के नाम से क्लोजर के तर्कों के मूल्यों को संदर्भित करने के लिए किया जा सकता है। यहां, $ 0 क्लोजर के पहले स्ट्रिंग तर्कों का उल्लेख करता है।
एजेंट स्मिथ

4

मेरा काम घटकों के साथ NSMutableArray पर काम करता है

var array = ["1", "2", "3"]
let stringRepresentation = array.componentsJoinedByString("-") // "1-2-3"

4

स्विफ्ट 2.2 में आपको घटकों का उपयोग करने के लिए NSArray में अपनी सरणी कास्ट करना पड़ सकता है ।JoinedByString (",")

let stringWithCommas = (yourArray as NSArray).componentsJoinedByString(",")

वैसे यह स्विफ्ट में ऑब्जेक्टिव-सी का अनुवाद मात्र है।
मुहम्मद जीशान

3

यदि आप सरणी में खाली तारों को खोदना चाहते हैं।

["Jet", "Fire"].filter { !$0.isEmpty }.joined(separator: "-")

यदि आप शून्य मानों को भी फ़िल्टर करना चाहते हैं:

["Jet", nil, "", "Fire"].flatMap { $0 }.filter { !$0.isEmpty }.joined(separator: "-")

1
बहुत ही सुंदर, धन्यवाद :)
चेशायरकाट

2
let arrayTemp :[String] = ["Mani","Singh","iOS Developer"]
    let stringAfterCombining = arrayTemp.componentsJoinedByString(" ")
   print("Result will be >>>  \(stringAfterCombining)")

परिणाम >>> मणि सिंह आईओएस डेवलपर होगा


1

आपके द्वारा बताए जा रहे स्विफ्ट के बराबर स्ट्रिंग इंटरपोलेशन है। यदि आप जावास्क्रिप्ट जैसी चीजों के बारे में सोच रहे हैं "x" + array, तो स्विफ्ट में समकक्ष है "x\(array)"

एक सामान्य नोट के रूप में, Printableप्रोटोकॉल बनाम स्ट्रिंग इंटरपोलेशन के बीच एक महत्वपूर्ण अंतर है। केवल कुछ वर्गों के अनुरूप है Printableहर वर्ग किसी न किसी तरह से स्ट्रिंग किया जा सकता है। यह सामान्य कार्य लिखते समय मददगार होता है। आपको अपने आप को Printableकक्षाओं में सीमित करने की आवश्यकता नहीं है ।


1

आप प्रिंट फ़ंक्शन का उपयोग करके किसी भी ऑब्जेक्ट को प्रिंट कर सकते हैं

या \(name)किसी वस्तु को स्ट्रिंग में बदलने के लिए उपयोग करें।

उदाहरण:

let array = [1,2,3,4]

print(array) // prints "[1,2,3,4]"

let string = "\(array)" // string == "[1,2,3,4]"
print(string) // prints "[1,2,3,4]"


0

एक विभाजक हिब्रू या जापानी जैसी कुछ भाषाओं के लिए एक बुरा विचार हो सकता है। इसे इस्तेमाल करे:

// Array of Strings
let array: [String] = ["red", "green", "blue"]
let arrayAsString: String = array.description
let stringAsData = arrayAsString.data(using: String.Encoding.utf16)
let arrayBack: [String] = try! JSONDecoder().decode([String].self, from: stringAsData!)

क्रमशः अन्य डेटा प्रकारों के लिए:

// Set of Doubles
let set: Set<Double> = [1, 2.0, 3]
let setAsString: String = set.description
let setStringAsData = setAsString.data(using: String.Encoding.utf16)
let setBack: Set<Double> = try! JSONDecoder().decode(Set<Double>.self, from: setStringAsData!)

0

यदि आपके पास स्ट्रिंग सरणी सूची है, तो Int में कनवर्ट करें

let arrayList = list.map { Int($0)!} 
     arrayList.description

यह आपको स्ट्रिंग मान देगा


0

किसी भी तत्व प्रकार के लिए

extension Array {

    func joined(glue:()->Element)->[Element]{
        var result:[Element] = [];
        result.reserveCapacity(count * 2);
        let last = count - 1;
        for (ix,item) in enumerated() {
            result.append(item);
            guard ix < last else{ continue }
            result.append(glue());
        }
        return result;
    }
}

0

इसे इस्तेमाल करे:

let categories = dictData?.value(forKeyPath: "listing_subcategories_id") as! NSMutableArray
                        let tempArray = NSMutableArray()
                        for dc in categories
                        {
                            let dictD = dc as? NSMutableDictionary
                            tempArray.add(dictD?.object(forKey: "subcategories_name") as! String)
                        }
                        let joinedString = tempArray.componentsJoined(by: ",")

-1

स्विफ्ट 3 के लिए:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    if textField == phoneField
    {
        let newString = NSString(string: textField.text!).replacingCharacters(in: range, with: string)
        let components = newString.components(separatedBy: NSCharacterSet.decimalDigits.inverted)

        let decimalString = NSString(string: components.joined(separator: ""))
        let length = decimalString.length
        let hasLeadingOne = length > 0 && decimalString.character(at: 0) == (1 as unichar)

        if length == 0 || (length > 10 && !hasLeadingOne) || length > 11
        {
            let newLength = NSString(string: textField.text!).length + (string as NSString).length - range.length as Int

            return (newLength > 10) ? false : true
        }
        var index = 0 as Int
        let formattedString = NSMutableString()

        if hasLeadingOne
        {
            formattedString.append("1 ")
            index += 1
        }
        if (length - index) > 3
        {
            let areaCode = decimalString.substring(with: NSMakeRange(index, 3))
            formattedString.appendFormat("(%@)", areaCode)
            index += 3
        }
        if length - index > 3
        {
            let prefix = decimalString.substring(with: NSMakeRange(index, 3))
            formattedString.appendFormat("%@-", prefix)
            index += 3
        }

        let remainder = decimalString.substring(from: index)
        formattedString.append(remainder)
        textField.text = formattedString as String
        return false
    }
    else
    {
        return true
    }
}

-1

यदि आप सवाल कुछ इस तरह से हैं: tobeFormattedString = ["a", "b", "c"] आउटपुट = "abc"

String(tobeFormattedString)


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