Свифт преобразовать строку в массив


Как я могу преобразовать строку "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];
}
10 79

10 ответов:

это еще проще в Swift:

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

это использует факты, которые

  • an Array может быть создан из SequenceType и
  • String соответствует SequenceType протокол, и генератор последовательности перечисляет символы.

и поскольку строки Swift имеют полную поддержку Unicode, это работает даже с символами вне "базовой многоязычной плоскости" (например ) и с расширенной графемой кластеры (такие Как, который на самом деле состоит из два скаляры Юникод).


обновление: начиная с Swift 2,String больше не соответствуют SequenceType, а characters свойство предоставляет последовательность Символы юникода:

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", " ", "", "", " ", ""]

Edit (Swift 4)

в Swift 4, Вы не должны использовать characters использовать map(). Просто сделай map() на строку.

"ABC".map { String() }
print(letters) // ["A", "B", "C"]
print(type(of: letters)) // Array<String>

или, если вы предпочитаете короче: "ABC".map(String.init) (2-байта )

Edit (Swift 2 & Swift 3)

в Swift 2 и Swift 3, Вы можете использовать ) } 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/

есть также эта полезная функция в строке: components (separatedBy: String)

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

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

    let string = "hell0"
    let ar = Array(string.characters)
    print(ar)

Martin R ответ является лучшим подходом, и, как он сказал, Поскольку строка соответствует протоколу 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)

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

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

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

обновлено для 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()}

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

или вы можете добавить расширение в строку.

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

затем вы можете назвать это так:

let charArr = "Cat".letterize()

в Swift 4, как String это коллекция Character, вы должны использовать map

let array1 = Array("hello") // Array<Character>
let array2 = Array("hello").map({ "\()" }) // Array<String>
let array3 = "hello".map(String.init) // Array<String>

нашел другой способ с помощью строки.Характерный вид.Думал, что могу поделиться

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

работает, но я предпочитаю решение Мартина "Р".