Преобразование строки Swift в массив
Как преобразовать строку "Hello" в массив [ "H", "e", "l", "l", "o" ] в Swift?
В 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];
}
Ответы
Ответ 1
В Swift еще проще:
let string : String = "Hello 🐶🐮 🇩🇪"
let characters = Array(string)
println(characters)
// [H, e, l, l, o, , 🐶, 🐮, , 🇩🇪]
Это использует факты, которые
- a
Array
может быть создан из SequenceType
и
-
String
соответствует протоколу SequenceType
, а его генератор последовательности
перечисляет символы.
И так как строки Swift имеют полную поддержку Unicode, это работает даже с символами
вне "Основного многоязычного плана" (например, 🐶) и с расширенной графемой
кластеров (таких как 🇩🇪, который фактически состоит из двух сканеров Unicode).
Обновление: с Swift 2, String
больше не соответствует
SequenceType
, но свойство characters
предоставляет последовательность
Юникодные символы:
let string = "Hello 🐶🐮 🇩🇪"
let characters = Array(string.characters)
print(characters)
Это работает в Swift 3.
Обновление: Начиная с Swift 4, String
является (снова) набором его
Character
s:
let string = "Hello 🐶🐮 🇩🇪"
let characters = Array(string)
print(characters)
// ["H", "e", "l", "l", "o", " ", "🐶", "🐮", " ", "🇩🇪"]
Ответ 2
Редактировать (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>
Или, если вы предпочитаете более короткий: "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/
Ответ 3
Существует также эта полезная функция для String: components (separateBy: String)
let string = "1;2;3"
let array = string.components(separatedBy: ";")
print(array) // returns ["1", "2", "3"]
Хорошо работает для обработки строк, разделенных символом типа ";" или даже "\n"
Ответ 4
Обновлено для 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)}
Или вы можете добавить расширение к String.
extension String {
func letterize() -> [Character] {
return Array(self.characters)
}
}
Затем вы можете вызвать его так:
let charArr = "Cat".letterize()
Ответ 5
let string = "hell0"
let ar = Array(string.characters)
print(ar)
Ответ 6
Мартин 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)
Ответ 7
В 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>
Ответ 8
Вы также можете создать расширение:
var strArray = "Hello, playground".Letterize()
extension String {
func Letterize() -> [String] {
return map(self) { String($0) }
}
}
Ответ 9
func letterize() -> [Character] {
return Array(self.characters)
}
Ответ 10
Нашел другой способ, используя String.CharacterView.Thought я мог бы поделиться
var reversedText:String = "reversed"
let characters = (reversedText.characters.reversed()).reversed
print(characters)
Также работает, но я предпочитаю решение Martin R.