Свифт преобразовать строку в массив
Как я могу преобразовать строку "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 ответов:
это еще проще в 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
это (опять же) коллекциюCharacter
s: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"
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() } } }
обновлено для 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()