将Swift字符串转换为数组

206
在Swift中,如何将字符串"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];
}
14个回答

454

在Swift中甚至更容易:

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

这里用到以下事实:

  • 可以从SequenceType创建Array,并且
  • String符合SequenceType协议,并且其序列生成器枚举字符。

而且由于Swift字符串完全支持Unicode,因此即使是超出“基本多文种平面”的字符(例如🦄),以及具有扩展字形簇的字符(例如👩‍❤️‍💋‍👨,它实际上由两个 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", " ", "", "", " ", ""]

2
你有没有想过为什么尝试连接(let joined = ", ".join(characters);)数组会导致'String' is not identical to 'Character'错误? - Mohamad
3
枚举字符串会产生字符序列,但", ".join(...)期望的却是一个字符串数组。下面devxoul的答案展示了如何将其拆分成字符串数组。 - Martin R
2
@Fonix:characters是一个集合,也是字符串字符的视图。从字符创建数组会复制一份。当然可以直接访问这些字符:for i in string.characters.indices { print(string.characters[i]) } 或者只需 for c in string.characters { print(c) } - Martin R
2
@Fonix:... 另一方面,对字符串的随机索引可能很慢,创建一个包含所有字符的数组会更有优势。例如:https://dev59.com/flkS5IYBdhLWcg3wFjCk。 - Martin R
2
@DaniSpringer:Swift 4 目前处于测试版阶段,您需要下载 Xcode 9 beta 版本:https://developer.apple.com/swift/resources/。 - Martin R
显示剩余15条评论

134

编辑(Swift 4)

在Swift 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字节)

编辑(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/


13
稍微简短一些:arr = map(str) { String($0) } - Martin R
1
使用 Array 初始化器代替: Array("ABC".characters) - chrisamanse
1
@chrisamanse,"ABC".charactersArray("ABC".characters)之间没有区别。 - devxoul
2
在Swift 3中有所不同。"ABC".characters返回类型为String.CharacterView。要将其转换为数组,特别是类型为[Character],您必须在其上使用Array初始化程序。 - chrisamanse
2
@chrisamanse 哦,我不知道那个。我错了。谢谢你指出来。顺便说一下,我本意是使用[String]而不是[Character],因为操作者想要一个字符串数组 :) - devxoul
显示剩余2条评论

38

String 还有一个有用的函数:components(separatedBy: String)

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

很适合处理像“;”或者“\n”这样的字符分隔的字符串。


20

对于 Swift 5.3 版本,很容易:

let string = "Hello world"
let characters = Array(string)

print(characters)

// ["H", "e", "l", "l", "o", " ", "w", "o", "r", "l", "d"]


15

更新至Swift 4

这里有三种方法。

//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)}

Swift 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()

7

关于 String 函数:components(separatedBy: String)

在 Swift 5.1 中,这个函数已经改为:

string.split(separator: "/")

此修改使得字符串拆分更加简单易懂。

对我来说工作正常..... - M Hamayun zeb

7
一个简单的方法是将变量进行映射,并将每个Character作为String返回:
let someText = "hello"

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

输出应该是["h", "e", "l", "l", "o"]

4

Martin R 的回答是最佳方法,正如他所说,因为字符串符合 SequenceType 协议,您也可以枚举一个字符串,在每次迭代中获取每个字符。

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
    let string = "hell0"
    let ar = Array(string.characters)
    print(ar)

在这个问题上,Swift 2和3之间没有任何变化。此解决方案与https://dev59.com/XF8e5IYBdhLWcg3wRIpQ#25921323中的Swift 2版本相同。 - Martin R

3
在Swift 4中,由于StringCharacter的集合,所以您需要使用map函数。
let array1 = Array("hello") // Array<Character>
let array2 = Array("hello").map({ "\($0)" }) // Array<String>
let array3 = "hello".map(String.init) // Array<String>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接