Swift配列を文字列に変換するにはどうすればよいですか?


353

プログラムでそれを行う方法は知っていますが、組み込みの方法があると確信しています...

私が使用したすべての言語には、配列を文字列と連結したり、print()関数などに渡したりすると吐き出される、オブジェクトのコレクションに対するある種のデフォルトのテキスト表現があります。AppleのSwift言語は簡単に配列を文字列に変換する組み込みの方法がありますか、それとも配列を文字列化するときに常に明示的にする必要がありますか?


3
Swift 4: array.descriptionまたは、カスタムのセパレータが必要な場合array.joined(separator: ",")
Jonathan Solorzano

回答:


697

配列に文字列が含まれている場合は、String' joinメソッドを使用できます。

var array = ["1", "2", "3"]

let stringRepresentation = "-".join(array) // "1-2-3"

スウィフト2

var array = ["1", "2", "3"]

let stringRepresentation = array.joinWithSeparator("-") // "1-2-3"

これは、特定のセパレーター(ハイフン、ブランク、コンマなど)を使用する場合に役立ちます。

それ以外の場合は、単にdescription配列の文字列表現を返すプロパティを使用できます。

let stringRepresentation = [1, 2, 3].description // "[1, 2, 3]"

ヒント:Printableプロトコルを実装するオブジェクトにはdescriptionプロパティがあります。独自のクラス/構造体でそのプロトコルを採用すると、それらも印刷しやすくなります

ではスウィフト3

  • joinになるjoined、例[nil, "1", "2"].flatMap({$0}).joined()
  • joinWithSeparatorになるjoined(separator:)(文字列の配列でのみ使用可能)

ではスウィフト4

var array = ["1", "2", "3"]
array.joined(separator:"-")

2
@Andrej:1.2と2.0の両方で動作します。文字列の配列を使用していますか?
アントニオ

1
アントニオ、ごめんなさい。アレイに問題がありました。これで、ソリューションが機能することを確認できます。:)
Andrej 2015

12
"-".join(array)Swift 2、Xcode 7 Beta 6では使用できなくなりました。使用してみてくださいarray.joinWithSeparator("-")
Harry Ng 2015

87
joinWithSeparator文字列の配列でのみ使用できます。他のオブジェクトの配列がある場合は、map最初に使用します。例:[1, 2, 3].map({"\($0)"}).joinWithSeparator(",")
Dmitry

3
@Dmitry文字列への変換に文字列補間soleyを使用しないでください。Stringでイニシャライザを使用する方がはるかに良い
Alexander-Reinstate Monica

130

Swift 5では、必要に応じて、問題を解決するために次のPlaygroundサンプルコードのいずれかを選択できます。


Charactersの配列をStringセパレータなしのに変換します。

let characterArray: [Character] = ["J", "o", "h", "n"]
let string = String(characterArray)

print(string)
// prints "John"

Stringsの配列をStringセパレータなしのに変換します。

let stringArray = ["Bob", "Dan", "Bryan"]
let string = stringArray.joined(separator: "")

print(string) // prints: "BobDanBryan"

Stringsの配列をString単語間の区切り文字を含むaに変換します。

let stringArray = ["Bob", "Dan", "Bryan"]
let string = stringArray.joined(separator: " ")

print(string) // prints: "Bob Dan Bryan"

Stringsの配列Stringを、文字間に区切り文字を含むaに変換します。

let stringArray = ["car", "bike", "boat"]
let characterArray = stringArray.flatMap { $0 }
let stringArray2 = characterArray.map { String($0) }
let string = stringArray2.joined(separator: ", ")

print(string) // prints: "c, a, r, b, i, k, e, b, o, a, t"

Floatsの配列をString、数値の間にセパレーターがあるaに変換します。

let floatArray = [12, 14.6, 35]
let stringArray = floatArray.map { String($0) }
let string = stringArray.joined(separator: "-")

print(string)
// prints "12.0-14.6-35.0"

「[1,2,3]」のような文字列があります。これを配列[Int]に簡単に変換する方法はありますか?簡単に、つまり.descriptionの逆のことですか?
user2363025 2017年

@ user2363025 uniはJSONデコーダーを使用できます。try JSONDecoder().decode([Int].self, from: Data(string.utf8))
レオダバス

48

Swift 2.0 Xcode 7.0ベータ6以降では、次のjoinWithSeparator()代わりに使用しますjoin()

var array = ["1", "2", "3"]
let stringRepresentation = array.joinWithSeparator("-") // "1-2-3"

joinWithSeparator の拡張として定義されています SequenceType

extension SequenceType where Generator.Element == String {
    /// Interpose the `separator` between elements of `self`, then concatenate
    /// the result.  For example:
    ///
    ///     ["foo", "bar", "baz"].joinWithSeparator("-|-") // "foo-|-bar-|-baz"
    @warn_unused_result
    public func joinWithSeparator(separator: String) -> String
}

23

スウィフト3

["I Love","Swift"].joined(separator:" ") // previously joinWithSeparator(" ")

1
["I Love"、 "Swift"]。joined(separator: "")
Loebre


11

誰も削減について言及していないので、ここにそれがあります:

[0, 1, 1, 0].map {"\($0)"}.reduce("") {$0 + $1 } // "0110"

関数型プログラミングの精神で🤖


3
物事を行うための素晴らしい方法、ありがとう...コマンドラインの終わりを短く追加: [0,1,1,0].map{"\($0)"}.reduce("",+)。😉
XLE_22

@ XLE_22[0,1,1,0].map(String.init).joined()
レオDabus

8

オプション/非オプション文字列の配列を変更するには

//Array of optional Strings
let array : [String?] = ["1",nil,"2","3","4"]

//Separator String
let separator = ","

//flatMap skips the nil values and then joined combines the non nil elements with the separator
let joinedString = array.flatMap{ $0 }.joined(separator: separator)


//Use Compact map in case of **Swift 4**
    let joinedString = array.compactMap{ $0 }.joined(separator: separator

print(joinedString)

ここでflatMapcompactMapは配列のnil値をスキップし、他の値を追加して結合された文字列を提供します。


3
@YashBediでスウィフト4我々は使用compactMapの代わりに、flatMap
エージェント・スミス

「$」の意味は?
アウグスト

2
@Augusto Swiftは、インラインクロージャーに省略引数名を自動的に提供します。これは、$ 0、$ 1、$ 2という名前でクロージャーの引数の値を参照するために使用できます。ここで、$ 0はクロージャーの最初のストリング引数を参照します。
エージェントスミス

4

鉱山はcomponentsJoinedByStringでNSMutableArrayで動作します

var array = ["1", "2", "3"]
let stringRepresentation = array.componentsJoinedByString("-") // "1-2-3"

4

Swift 2.2では、componentsJoinedByString( "、")を使用するために、配列をNSArrayにキャストする必要がある場合があります。

let stringWithCommas = (yourArray as NSArray).componentsJoinedByString(",")

ちなみにこれは、objective-cをすばやく翻訳したものです。
Muhammad Zeeshan 16

3

配列内の空の文字列を捨てたい場合。

["Jet", "Fire"].filter { !$0.isEmpty }.joined(separator: "-")

nil値もフィルタリングする場合:

["Jet", nil, "", "Fire"].flatMap { $0 }.filter { !$0.isEmpty }.joined(separator: "-")

1
非常にエレガントです、ありがとうございました:)
CheshireKat

2
let arrayTemp :[String] = ["Mani","Singh","iOS Developer"]
    let stringAfterCombining = arrayTemp.componentsJoinedByString(" ")
   print("Result will be >>>  \(stringAfterCombining)")

結果は>>> Mani Singh iOS Developerになります


1

あなたが説明しているものに相当するSwiftは文字列補間です。JavaScriptのようなことを考えている場合"x" + array、Swiftでの同等の機能は"x\(array)"です。

一般的な注意として、文字列補間とPrintableプロトコルの間には重要な違いがあります。特定のクラスのみがに準拠していPrintableます。すべてのクラスはどういうわけか文字列補間することができます。これは、ジェネリック関数を作成するときに役立ちます。Printableクラスに限定する必要はありません。


1

印刷機能を使用して任意のオブジェクトを印刷できます

または\(name)、任意のオブジェクトを文字列に変換するために使用します。

例:

let array = [1,2,3,4]

print(array) // prints "[1,2,3,4]"

let string = "\(array)" // string == "[1,2,3,4]"
print(string) // prints "[1,2,3,4]"

1

の拡張を作成しますArray

extension Array {

    var string: String? {

        do {

            let data = try JSONSerialization.data(withJSONObject: self, options: [.prettyPrinted])

            return String(data: data, encoding: .utf8)

        } catch {

            return nil
        }
    }
}

0

区切り文字は、ヘブライ語や日本語などの一部の言語にとっては悪い考えです。これを試して:

// Array of Strings
let array: [String] = ["red", "green", "blue"]
let arrayAsString: String = array.description
let stringAsData = arrayAsString.data(using: String.Encoding.utf16)
let arrayBack: [String] = try! JSONDecoder().decode([String].self, from: stringAsData!)

それぞれ他のデータ型の場合:

// Set of Doubles
let set: Set<Double> = [1, 2.0, 3]
let setAsString: String = set.description
let setStringAsData = setAsString.data(using: String.Encoding.utf16)
let setBack: Set<Double> = try! JSONDecoder().decode(Set<Double>.self, from: setStringAsData!)

0

文字列配列リストがある場合は、Intに変換します

let arrayList = list.map { Int($0)!} 
     arrayList.description

それはあなたに文字列値を与えます


0

任意の要素タイプ

extension Array {

    func joined(glue:()->Element)->[Element]{
        var result:[Element] = [];
        result.reserveCapacity(count * 2);
        let last = count - 1;
        for (ix,item) in enumerated() {
            result.append(item);
            guard ix < last else{ continue }
            result.append(glue());
        }
        return result;
    }
}

0

これを試して:

let categories = dictData?.value(forKeyPath: "listing_subcategories_id") as! NSMutableArray
                        let tempArray = NSMutableArray()
                        for dc in categories
                        {
                            let dictD = dc as? NSMutableDictionary
                            tempArray.add(dictD?.object(forKey: "subcategories_name") as! String)
                        }
                        let joinedString = tempArray.componentsJoined(by: ",")

-1

SWIFT 3の場合:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    if textField == phoneField
    {
        let newString = NSString(string: textField.text!).replacingCharacters(in: range, with: string)
        let components = newString.components(separatedBy: NSCharacterSet.decimalDigits.inverted)

        let decimalString = NSString(string: components.joined(separator: ""))
        let length = decimalString.length
        let hasLeadingOne = length > 0 && decimalString.character(at: 0) == (1 as unichar)

        if length == 0 || (length > 10 && !hasLeadingOne) || length > 11
        {
            let newLength = NSString(string: textField.text!).length + (string as NSString).length - range.length as Int

            return (newLength > 10) ? false : true
        }
        var index = 0 as Int
        let formattedString = NSMutableString()

        if hasLeadingOne
        {
            formattedString.append("1 ")
            index += 1
        }
        if (length - index) > 3
        {
            let areaCode = decimalString.substring(with: NSMakeRange(index, 3))
            formattedString.appendFormat("(%@)", areaCode)
            index += 3
        }
        if length - index > 3
        {
            let prefix = decimalString.substring(with: NSMakeRange(index, 3))
            formattedString.appendFormat("%@-", prefix)
            index += 3
        }

        let remainder = decimalString.substring(from: index)
        formattedString.append(remainder)
        textField.text = formattedString as String
        return false
    }
    else
    {
        return true
    }
}

-1

質問が次のようなものであれば:tobeFormattedString = ["a"、 "b"、 "c"]出力= "abc"

String(tobeFormattedString)


いいえ、これは機能しません。Stringそれを行うことができる初期化子はありません。カスタム拡張機能またはサードパーティのライブラリを使用しているか、単に明白に間違っているかのどちらかです。
エリックアヤ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.