Преобразование строки 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];
}
4b9b3361

В 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", " ", "????", "????", " ", "????????"]
233
ответ дан 18 сент. '14 в 22:58
источник

Изменить (Swift 4)

В Swift 4 вам не нужно использовать characters для использования map(). Просто map() на String.

"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/

74
ответ дан 24 нояб. '14 в 11:34
источник

Существует также эта полезная функция для String: components (separateBy: String)

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

Хорошо работает для обработки строк, разделенных символом типа ";" или даже "\n"

6
ответ дан 01 июня '17 в 16:35
источник

Обновлено для 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()
2
ответ дан 20 сент. '17 в 4:25
источник

Мартин 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
ответ дан 18 сент. '14 в 23:13
источник

В 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>
2
ответ дан 23 мая '18 в 11:19
источник

Вы также можете создать расширение:

var strArray = "Hello, playground".Letterize()

extension String {
    func Letterize() -> [String] {
        return map(self) { String($0) }
    }
}
1
ответ дан 09 июня '15 в 10:28
источник

Нашел другой способ, используя String.CharacterView.Thought я мог бы поделиться

var reversedText:String = "reversed"
let characters = (reversedText.characters.reversed()).reversed
print(characters)

Также работает, но я предпочитаю решение Martin R.

0
ответ дан 15 дек. '16 в 17:15
источник