将Swift字符串转换为数组


133

如何在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];
}

Answers:


338

在Swift中甚至更容易:

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

这利用了以下事实:

  • 一个Array可以从被创建SequenceType,并且
  • 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(再次)是其Characters 的集合 :

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'错误吗?
Mohamad'1

3
@Mohamad:枚举字符串会产生一个字符序列,但是", ".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:...另一方面,随机索引到字符串中可能会很慢,并且一次创建一个包含所有字符的数组可能是有利的。例如:stackoverflow.com/questions/40371929/...
Martin R

2
@DaniSpringer:Swift 4目前处于测试阶段,您需要Xcode 9 beta:developer.apple.com/swift/resources
Martin R

102

编辑(快速4)

在Swift 4中,您不必使用charactersuse map()。只需map()对String执行即可。

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()function 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/


12
稍短一些:arr = map(str) { String($0) }
Martin R

1
请改用Array初始化程序:Array("ABC".characters)
chrisamanse

1
@chrisamanse,"ABC".characters和之间没有区别Array("ABC".characters)
devxoul

2
在Swift 3中不同,"ABC".characters返回一个type String.CharacterView。要将其转换为特定类型的数组,[Character]您必须在其上使用Array初始化程序。
chrisamanse

2
@chrisamanse哦,我不知道。我错了。感谢您指出。顺便说一句,我打算[String]而不是[Character]因为op想要一个字符串数组:)
devxoul '16

22

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

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

处理以“;”之类的字符分隔的字符串效果很好 甚至是“ \ n”


8

为Swift 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)}

或者,您可以向String添加扩展名。

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

然后您可以这样称呼它:

let charArr = "Cat".letterize()


3

Martin R的回答是最好的方法,正如他所说,由于String符合SquenceType协议,因此您还可以枚举字符串,从而在每次迭代中获取每个字符。

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,2014年

3

在Swift 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变量进行返回,并将每个返回CharacterString

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
您能否提供更多信息,为什么它会起作用?:)
pix

1
@pix我认为他的意思是将其定义为String扩展中的函数。我将其添加到我的答案中。
ScottyBlades

1

用于String:components(separatedBy:String)上的函数

在Swift 5.1中

更改为:

string.split(separator: "/")

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.