将Swiftstring转换为数组

在Swift中如何将string“Hello”转换为数组[“H”,“e”,“l”,“l”,“o”]?

在Objective-C中,我使用了这个:

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]; } 

在Swift中更容易:

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

这使用的事实

  • 一个Array可以通过SequenceType创build
  • String符合SequenceType协议,其序列生成器枚举字符。

而且由于Swiftstring完全支持Unicode,所以即使字符在“基本多语言平面”之外(如Basic)以及扩展字形群集(如实际由两个 Unicode标量组成的🇩🇪)也可以工作。


更新:从Swift 2开始, String不再符合SequenceType ,但是characters属性提供了一系列的Unicode字符:

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

这也适用于Swift 3


更新:从Swift 4开始, String (再次)是它的Character的集合:

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

编辑(Swift 4)

在Swift 4中,你不必使用characters来使用map() 。 只要在String上做map()

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

或者,如果你更喜欢短: "ABC".map(String.init) (2字节😀)

编辑(Swift 2&Swift 3)

在Swift 2和Swift 3中,可以使用map()函数来处理characters属性。

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

原文(Swift 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/

  let string = "hell0" let ar = Array(string.characters) print(ar) 

在String上还有这个有用的函数: components(separatedBy:String)

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

处理由字符分隔的string,如“;” 甚至“\ n”

马丁R答案是最好的方法,正如他所说,由于string符合SquenceType协议,您还可以枚举一个string,每个迭代获取每个字符。

 let characters = "Hello" var charactersArray: [Character] = [] for (index, character) in enumerate(characters) { //do something with the character at index charactersArray.append(character) } println(charactersArray) 

你也可以创build一个扩展:

 var strArray = "Hello, playground".Letterize() extension String { func Letterize() -> [String] { return map(self) { String($0) } } } 
 func letterize() -> [Character] { return Array(self.characters) } 

通过使用String.CharacterViewfind另一种方法。我可以分享

 var reversedText:String = "reversed" let characters = (reversedText.characters.reversed()).reversed print(characters) 

还有效,我还是比较喜欢Martin R的解决scheme。

这里有3种方法。

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

在某些情况下,人们真正想要的是将string转换为每个字符长度为1的小string数组。 这是一个非常有效的方法:

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

或者你可以添加一个扩展到string。

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

那么你可以这样调用它:

 let charArr = "Cat".letterize()