将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 Multilingual Plane”之外的字符(如🐶)以及扩展的字形群集(如实际由两个 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)
马丁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)
在String上还有这个有用的函数: components(separatedBy:String)
let string = "1;2;3" let array = string.components(separatedBy: ";") print(array) // returns ["1", "2", "3"]
处理由字符分隔的string,如“;” 甚至“\ n”
你也可以创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()