सरणी के लिए स्विफ्ट स्ट्रिंग परिवर्तित करें


133

मैं स्विफ्ट में एक स्ट्रिंग "हैलो" को एक सरणी ["एच", "ई", "एल", "एल", "ओ"] में कैसे बदल सकता हूं?

उद्देश्य-सी में मैंने इसका उपयोग किया है:

NSMutableArray *characters = [[NSMutableArray alloc] initWithCapacity:[myString length]];
for (int i=0; i < [myString length]; i++) {
    NSString *ichar  = [NSString stringWithFormat:@"%c", [myString characterAtIndex:i]];
    [characters addObject:ichar];
}

जवाबों:


339

स्विफ्ट में यह और भी आसान है:

let string : String = "Hello 🐶🐮 🇩🇪"
let characters = Array(string)
println(characters)
// [H, e, l, l, o,  , 🐶, 🐮,  , 🇩🇪]

यह उन तथ्यों का उपयोग करता है जो

  • एक Arrayएक से बनाया जा सकता SequenceTypeहै, और
  • StringSequenceTypeप्रोटोकॉल के अनुरूप है , और इसके अनुक्रम जनरेटर वर्णों की गणना करता है।

और चूंकि स्विफ्ट के तारों को यूनिकोड का पूरा समर्थन है, इसलिए यह "बेसिक मल्टीलिंगुअल प्लेन" (जैसे कि the) के बाहर के पात्रों के साथ भी काम करता है और विस्तारित ग्रैफेम क्लस्टर (जैसे कि 🇩🇪, जो वास्तव में दो यूनिकोड स्केल से बना होता है ) के साथ काम करता है।


अद्यतन: स्विफ्ट 2 के रूप में, String अब अनुरूप नहीं है SequenceType, लेकिन charactersसंपत्ति यूनिकोड वर्णों का एक क्रम प्रदान करती है:

let string = "Hello 🐶🐮 🇩🇪"
let characters = Array(string.characters)
print(characters)

यह स्विफ्ट 3 में भी काम करता है ।


अपडेट: स्विफ्ट 4 के रूप में, String फिर से अपने Characterएस का एक संग्रह है :

let string = "Hello 🐶🐮 🇩🇪"
let characters = Array(string)
print(characters)
// ["H", "e", "l", "l", "o", " ", "🐶", "🐮", " ", "🇩🇪"]

1
क्या आपको अंदाजा है कि let joined = ", ".join(characters);सरणी में 'String' is not identical to 'Character'त्रुटि के कारण ( ) जुड़ने की कोशिश क्यों की जा रही है ?
मोहम्मद

3
@ मोहम्मद: एक स्ट्रिंग की गणना करने से वर्णों का एक क्रम उत्पन्न होता है, लेकिन ", ".join(...)एक तार की एक सरणी की अपेक्षा करता है। नीचे दिए गए devxoul के उत्तर से पता चलता है कि आप किस प्रकार तार के विभाजन में विभाजित हो सकते हैं।
मार्टिन आर

2
@ फ़ॉनिक्स: स्ट्रिंग्स के पात्रों पर charactersएक संग्रह और एक दृश्य है । पात्रों से एक सरणी बनाकर एक प्रतिलिपि बनाता है। - बेशक पात्रों को सीधे एक्सेस कर सकते हैं: for i in string.characters.indices { print(string.characters[i]) }या सिर्फfor c in string.characters { print(c) }
मार्टिन आर

2
@ फ़ॉनिक्स: ... दूसरी ओर, स्ट्रेंथ में रैंडम इंडेक्सिंग धीमी हो सकती है और एक बार सभी वर्णों के साथ एक सरणी बनाना फायदेमंद हो सकता है। उदाहरण: stackoverflow.com/questions/40371929/…
मार्टिन आर

2
@DaniSpringer: स्विफ्ट 4 अभी बीटा में है, आपको Xcode 9 बीटा की आवश्यकता होगी: developer.apple.com/swift/resources
मार्टिन आर

102

संपादित करें (स्विफ्ट 4)

स्विफ्ट 4 में, आपको उपयोग charactersकरने की आवश्यकता नहीं है map()। सिर्फ map()स्ट्रिंग पर करते हैं ।

let letters = "ABC".map { String($0) }
print(letters) // ["A", "B", "C"]
print(type(of: letters)) // Array<String>

या यदि आप कम पसंद करते हैं: "ABC".map(String.init)(2-बाइट्स:)

संपादित करें (स्विफ्ट 2 और स्विफ्ट 3)

स्विफ्ट 2 और स्विफ्ट 3 में, आप संपत्ति में map()फ़ंक्शन का उपयोग कर सकते charactersहैं।

let letters = "ABC".characters.map { String($0) }
print(letters) // ["A", "B", "C"]

मूल (स्विफ्ट 1.x)

स्वीकृत उत्तर सबसे अच्छा नहीं लगता, क्योंकि अनुक्रम-परिवर्तित अनुक्रम Stringनहीं है String, लेकिन Character:

$ swift
Welcome to Swift!  Type :help for assistance.
  1> Array("ABC")
$R0: [Character] = 3 values {
  [0] = "A"
  [1] = "B"
  [2] = "C"
}

यह नीचे मेरे लिए काम करता है:

let str = "ABC"
let arr = map(str) { s -> String in String(s) }

एक वैश्विक समारोह के लिए संदर्भ map()यहां है: http://swifter.natecook.com/func/map/


12
थोड़ा छोटा:arr = map(str) { String($0) }
मार्टिन आर

1
Arrayइसके बजाय Array("ABC".characters)
इनिशलाइज़र का

1
@chrisamanse, के बीच कोई अंतर नहीं है "ABC".charactersऔर Array("ABC".characters)
devxoul

2
यह स्विफ्ट 3 में अलग है । "ABC".charactersएक प्रकार देता है String.CharacterView। इसे एक सरणी में बदलने के लिए, विशेष रूप से प्रकार का [Character], आपको इस Arrayपर इनिशलाइज़र का उपयोग करना होगा।
क्रिसमन

2
@chrisamanse ओह, मुझे नहीं पता था कि। मैं गलत था। इस पर ध्यान दिलाने के लिए धन्यवाद। वैसे, मैं [String]इसके बजाय इरादा [Character]था क्योंकि सेशन एक स्ट्रिंग सरणी चाहता था :)
devxoul

22

स्ट्रिंग पर यह उपयोगी फ़ंक्शन भी है: घटक (अलग-अलग: स्ट्रिंग)

let string = "1;2;3"
let array = string.components(separatedBy: ";")
print(array) // returns ["1", "2", "3"]

";;" या यहां तक ​​कि "\ n"


8

स्विफ्ट 4 के लिए अपडेट किया गया

यहाँ 3 तरीके हैं।

//array of Characters
let charArr1 = [Character](myString)

//array of String.element
let charArr2 = Array(myString)

for char in myString {
  //char is of type Character
}

कुछ मामलों में, जो लोग वास्तव में चाहते हैं, वह एक स्ट्रिंग को 1 वर्ण लंबाई के साथ छोटे तारों के एक सरणी में बदलने का एक तरीका है। यहाँ एक सुपर कुशल तरीका है कि:

//array of String
var strArr = myString.map { String($0)}

स्विफ्ट 3

यहाँ 3 तरीके हैं।

let charArr1 = [Character](myString.characters)
let charArr2 = Array(myString.characters)
for char in myString.characters {
  //char is of type Character
}

कुछ मामलों में, जो लोग वास्तव में चाहते हैं, वह एक स्ट्रिंग को 1 वर्ण लंबाई के साथ छोटे तारों के एक सरणी में बदलने का एक तरीका है। यहाँ एक सुपर कुशल तरीका है कि:

var strArr = myString.characters.map { String($0)}

या आप स्ट्रिंग में एक्सटेंशन जोड़ सकते हैं।

extension String {
   func letterize() -> [Character] {
     return Array(self.characters)
  }
}

तो आप इसे इस तरह से कॉल कर सकते हैं:

let charArr = "Cat".letterize()


3

मार्टिन आर का जवाब सबसे अच्छा तरीका है, और जैसा कि उन्होंने कहा, क्योंकि स्ट्रिंग स्क्वरटाइप प्रोटोकॉल के अनुरूप है, आप प्रत्येक पुनरावृत्ति पर प्रत्येक चरित्र को प्राप्त करते हुए, एक स्ट्रिंग की गणना भी कर सकते हैं।

let characters = "Hello"
var charactersArray: [Character] = []

for (index, character) in enumerate(characters) {
    //do something with the character at index
    charactersArray.append(character)
}

println(charactersArray)

2
या बस के for character in characters { charactersArray.append(character)}बिनाenumeration()
Tieme

3

स्विफ्ट 4 में, जैसा Stringकि एक संग्रह है Character, आपको उपयोग करने की आवश्यकता हैmap

let array1 = Array("hello") // Array<Character>
let array2 = Array("hello").map({ "\($0)" }) // Array<String>
let array3 = "hello".map(String.init) // Array<String>

3

ऐसा करने का एक आसान तरीका mapचर के लिए है और प्रत्येक Characterको एक के रूप में वापस करना है String:

let someText = "hello"

let array = someText.map({ String($0) }) // [String]

आउटपुट होना चाहिए ["h", "e", "l", "l", "o"]


1

आप एक एक्सटेंशन भी बना सकते हैं:

var strArray = "Hello, playground".Letterize()

extension String {
    func Letterize() -> [String] {
        return map(self) { String($0) }
    }
}

1
func letterize() -> [Character] {
    return Array(self.characters)
}

2
क्या आप अधिक जानकारी प्रदान कर सकते हैं कि यह क्यों काम करेगा? :)
पिक्स

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

1

स्ट्रिंग पर फ़ंक्शन के लिए: घटक (अलग-अलग: स्ट्रिंग)

स्विफ्ट में 5.1

इसमें परिवर्तन करें:

string.split(separator: "/")

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.