web-dev-qa-db-ja.com

Swift文字列を配列に変換する

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];
}
104
Mr.KLD

Swiftではさらに簡単です。

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

これは、

  • ArraySequenceTypeから作成できます。
  • StringSequenceTypeプロトコルに準拠しており、そのシーケンスジェネレータは文字を列挙します。

Swift文字列はUnicodeを完全にサポートしているので、これは "Basic Multilingual Plane"の外側の文字(????など)や拡張書記素クラスタ(????????など)でも機能します。実際には2つのUnicodeスカラーで構成されています)。


更新:Swift 2以降StringSequenceTypeに準拠しなくなりましたが、charactersプロパティはUnicode文字のシーケンスを提供します。

let string = "Hello ???????? ????????"
let characters = Array(string.characters)
print(characters)

これはSwiftでも動作します。


更新:Swift 4以降Stringは(同じく)そのCharactersのコレクションです。

let string = "Hello ???????? ????????"
let characters = Array(string)
print(characters)
// ["H", "e", "l", "l", "o", " ", "????", "????", " ", "????????"]
280
Martin R

編集(スイフト4)

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)

Swift 2とSwift 3では、charactersプロパティにmap()関数を使用できます。

let letters = "ABC".characters.map { String($0) }
print(letters) // ["A", "B", "C"]

オリジナル(Swift 1.x)

シーケンス変換されたStringStringシーケンスではなく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/

86
devxoul

Stringにはこの便利な関数もあります。components(separateBy:String)

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

";"のような文字で区切られた文字列を処理するのに適しています。あるいは "\ n"

10
Frédéric Adda

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()
5
ScottyBlades
    let string = "hell0"
    let ar = Array(string.characters)
    print(ar)
4
William Hu

Swift 4では、StringCharacterのコレクションであるため、mapを使用する必要があります。

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

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)
2
Alberto Barrera
func letterize() -> [Character] {
    return Array(self.characters)
}

拡張機能を作成することもできます。

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

extension String {
    func Letterize() -> [String] {
        return map(self) { String($0) }
    }
}
1
fabrizioM