Swift文字列を配列に変換


133

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];
}

回答:


339

Swiftではさらに簡単です。

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

これは、

  • ArrayAから作成することができSequenceType、かつ
  • StringSequenceTypeプロトコルに準拠し、そのシーケンスジェネレータは文字を列挙します。

また、Swift文字列はUnicodeを完全にサポートしているので、これは「基本多言語面」の外の文字(🐶など)や拡張書記素クラスター(実際には2つの Unicodeスカラーで構成される🇩🇪など)でも機能します。


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

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", " ", "🐶", "🐮", " ", "🇩🇪"]

1
let joined = ", ".join(characters);配列を結合()しようとすると'String' is not identical to 'Character'エラーが発生する理由はありますか?
モハマド2015年

3
@Mohamad:文字列を列挙すると一連の文字が生成されますが、文字列の配列が必要", ".join(...)です。以下のdevxoulの回答は、文字列の配列に分割する方法を示しています。
Martin R

2
@Fonix:文字列のcharactersコレクションとビューです。文字から配列を作成すると、コピーが作成されます。–もちろん、キャラクターに直接アクセスできます。for i in string.characters.indices { print(string.characters[i]) }または単にfor c in string.characters { print(c) }
マーティンR

2
@Fonix:...一方、文字列へのランダムなインデックス付けは遅くなる可能性があり、すべての文字を含む配列を一度作成すると有利な場合があります。例:stackoverflow.com/questions/40371929/…
マーティンR

2
@DaniSpringer:Swift 4は現在ベータ版です。Xcode9ベータ版が必要です:developer.apple.com/swift/resources
マーティンR

102

編集(Swift 4)

Swift 4では、を使用charactersする必要はありませんmap()map()文字列を実行するだけです。

let letters = "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)

sequence-converted 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/


12
少し短い:arr = map(str) { String($0) }
Martin R

1
使用するArray代わりに、初期化子を:Array("ABC".characters)
chrisamanse

1
@chrisamanse、との間に違いは"ABC".charactersありませんArray("ABC".characters)
devxoul 2016

2
Swift 3で"ABC".charactersは異なりますString.CharacterView。型を返します。それを特にタイプの配列に変換するには、[Character]そのArray上で初期化子を使用する必要があります。
chrisamanse

2
@chrisamanseああ、私はそれを知りませんでした。私は間違っていた。指摘してくれてありがとう。ちなみに、opが文字列配列を望んでいたので、[String]代わりに私は意図しました[Character]:)
devxoul

22

Stringにもこの便利な関数があります:components(separatedBy:String)

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

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


8

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

スウィフト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($0)}

または、Stringに拡張子を追加できます。

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

その後、次のように呼び出すことができます。

let charArr = "Cat".letterize()


3

マーティン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
または、単にfor character in characters { charactersArray.append(character)}なしenumeration()
Tieme 2014年

3

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>

3

これを行う簡単な方法はmap、変数に対して、それぞれをCharacterとして返すことStringです。

let someText = "hello"

let array = someText.map({ String($0) }) // [String]

出力はになります["h", "e", "l", "l", "o"]


1

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

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

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


1

Stringの関数の場合:components(separatedBy:String)

Swift 5.1

変更があります:

string.split(separator: "/")

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.