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];
}
Swiftではさらに簡単です。
let string : String = "Hello ???????? ????????"
let characters = Array(string)
println(characters)
// [H, e, l, l, o, , ????, ????, , ????????]
これは、
Array
はSequenceType
から作成できます。String
はSequenceType
プロトコルに準拠しており、そのシーケンスジェネレータは文字を列挙します。Swift文字列はUnicodeを完全にサポートしているので、これは "Basic Multilingual Plane"の外側の文字(????など)や拡張書記素クラスタ(????????など)でも機能します。実際には2つのUnicodeスカラーで構成されています)。
更新:Swift 2以降String
はSequenceType
に準拠しなくなりましたが、characters
プロパティはUnicode文字のシーケンスを提供します。
let string = "Hello ???????? ????????"
let characters = Array(string.characters)
print(characters)
これはSwiftでも動作します。
更新:Swift 4以降String
は(同じく)そのCharacter
sのコレクションです。
let string = "Hello ???????? ????????"
let characters = Array(string)
print(characters)
// ["H", "e", "l", "l", "o", " ", "????", "????", " ", "????????"]
Swift 4では、map()
を使うのにcharacters
を使う必要はありません。 Stringに対してmap()
を実行するだけです。
let letters = "ABC".map { String($0) }
print(letters) // ["A", "B", "C"]
print(type(of: letters)) // Array<String>
それとももっと短くしたいのなら:"ABC".map(String.init)
(2-byte ????)
Swift 2とSwift 3では、characters
プロパティにmap()
関数を使用できます。
let letters = "ABC".characters.map { String($0) }
print(letters) // ["A", "B", "C"]
シーケンス変換された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/
Stringにはこの便利な関数もあります。components(separateBy:String)
let string = "1;2;3"
let array = string.components(separatedBy: ";")
print(array) // returns ["1", "2", "3"]
";"のような文字で区切られた文字列を処理するのに適しています。あるいは "\ n"
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($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()
let string = "hell0"
let ar = Array(string.characters)
print(ar)
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>
Martin 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)
func letterize() -> [Character] {
return Array(self.characters)
}
拡張機能を作成することもできます。
var strArray = "Hello, playground".Letterize()
extension String {
func Letterize() -> [String] {
return map(self) { String($0) }
}
}