将Swift字符串转换为数组

Mr.*_*KLD 118 arrays string ios swift

如何在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];
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*n R 306

在Swift中更容易:

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

这使用了事实

  • 一个Array可以从a SequenceType,和创建
  • String符合SequenceType协议,其序列生成器枚举字符.

由于Swift字符串完全支持Unicode,因此即使使用"基本多语言平面"之外的字符(例如)和扩展的字形集群(例如,实际上由两个 Unicode标量组成)也可以使用.


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

let string = "Hello  "
let characters = Array(string.characters)
print(characters)
Run Code Online (Sandbox Code Playgroud)

这也适用于Swift 3.


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

let string = "Hello  "
let characters = Array(string)
print(characters)
// ["H", "e", "l", "l", "o", " ", "", "", " ", ""]
Run Code Online (Sandbox Code Playgroud)

  • 您知道为什么尝试连接 (`let join = ", ".join(characters);`) 数组会导致“String”与“Character”不同错误吗? (2认同)
  • @Mohamad:枚举一个字符串会产生一系列字符,但是``,".join(...)`需要一个字符串数组.下面的devxoul的答案显示了你如何分裂成一个字符串数组. (2认同)
  • @Fonix:`characters` 是字符串字符的集合和*视图*。从字符创建一个数组会生成一个副本。– 当然可以直接访问字符:`for i in string.characters.indices { print(string.characters[i]) }` 或只是`for c in string.characters { print(c) }` (2认同)
  • @Fonix:...另一方面,对字符串的随机索引可能很慢,并且一次性创建一个包含所有字符的数组可能是有利的。示例:http://stackoverflow.com/questions/40371929/slow-swift-string-performance。 (2认同)
  • @DaniSpringer:Swift 4 目前处于测试阶段,您需要 Xcode 9 测试版:https://developer.apple.com/swift/resources/。 (2认同)

dev*_*oul 94

编辑(Swift 4)

在Swift 4中,您不必characters使用map().就map()在String上做.

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

或者,如果你更喜欢更短:"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"]
Run Code Online (Sandbox Code Playgroud)

原创(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"
}
Run Code Online (Sandbox Code Playgroud)

以下内容适用于我:

let str = "ABC"
let arr = map(str) { s -> String in String(s) }
Run Code Online (Sandbox Code Playgroud)

map()这里有一个全局函数的参考:http://swifter.natecook.com/func/map/

  • 略短:`arr = map(str){String($ 0)}` (11认同)
  • 它在 Swift 3 中有所不同。 `"ABC".characters` 返回一个类型 `String.CharacterView`。要将其转换为数组,特别是类型为 `[Character]`,您必须在其上使用 `Array` 初始值设定项。 (2认同)
  • @chrisamanse 哦,我不知道。我错了。谢谢你指出。顺便说一句,我打算用`[String]`代替`[Character]`,因为op想要一个字符串数组:) (2认同)

Ali*_*mad 21

对于 Swift 5.3 版本,它很简单:

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

print(characters)
Run Code Online (Sandbox Code Playgroud)

// [“你好世界”]


Fré*_*dda 14

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

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

适用于处理由";"之类的字符分隔的字符串 甚至"\n"


Sco*_*des 6

为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
}
Run Code Online (Sandbox Code Playgroud)

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

//array of String
var strArr = myString.map { String($0)}
Run Code Online (Sandbox Code Playgroud)

迅捷3

这是3种方式。

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

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

var strArr = myString.characters.map { String($0)}
Run Code Online (Sandbox Code Playgroud)

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

extension String {
   func letterize() -> [Character] {
     return Array(self.characters)
  }
}
Run Code Online (Sandbox Code Playgroud)

然后您可以这样称呼它:

let charArr = "Cat".letterize()
Run Code Online (Sandbox Code Playgroud)


小智 5

对于字符串上的函数:components(separatedBy: String)

在 Swift 5.1 中

更改为:

string.split(separator: "/")


小智 5

一个简单的方法是对map变量并将每个Character作为 a返回String

let someText = "hello"

let array = someText.map({ String($0) }) // [String]
Run Code Online (Sandbox Code Playgroud)

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