Comment convertir un tableau Swift en chaîne?

353

Je sais comment le faire par programmation, mais je suis sûr qu'il existe une méthode intégrée ...

Chaque langue que j'ai utilisée a une sorte de représentation textuelle par défaut pour une collection d'objets qu'elle crache lorsque vous essayez de concaténer le tableau avec une chaîne, ou de la passer à une fonction print (), etc. Est-ce que le langage Swift d'Apple avoir un moyen intégré de transformer facilement un tableau en chaîne, ou devons-nous toujours être explicites lors de la chaîne d'un tableau?

Troy
la source
3
Swift 4: array.description ou si vous voulez un séparateur personnaliséarray.joined(separator: ",")
Jonathan Solorzano

Réponses:

699

Si le tableau contient des chaînes, vous pouvez utiliser la Stringde » joinméthode:

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

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

Dans Swift 2 :

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

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

Cela peut être utile si vous souhaitez utiliser un séparateur spécifique (hypen, vide, virgule, etc.).

Sinon, vous pouvez simplement utiliser la descriptionpropriété, qui renvoie une représentation sous forme de chaîne du tableau:

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

Astuce: tout objet implémentant le Printableprotocole a undescription propriété. Si vous adoptez ce protocole dans vos propres classes / structures, vous les rendez également imprimables

Dans Swift 3

  • joindevient joined, exemple[nil, "1", "2"].flatMap({$0}).joined()
  • joinWithSeparatordevient joined(separator:)(uniquement disponible pour Array of Strings)

Dans Swift 4

var array = ["1", "2", "3"]
array.joined(separator:"-")
Antonio
la source
2
@Andrej: Cela fonctionne à la fois sur 1.2 et 2.0. Utilisez-vous un tableau de chaînes?
Antonio
1
Antonio, désolé, ma mauvaise. J'ai eu un problème avec ma baie. Je peux maintenant confirmer que votre solution fonctionne. :)
Andrej
12
"-".join(array)n'est plus disponible dans Swift 2, Xcode 7 Beta 6, essayez d'utiliserarray.joinWithSeparator("-")
Harry Ng
87
joinWithSeparatorn'est disponible que pour un tableau de chaînes. Si vous avez un tableau d'autres objets, utilisez-le d' mapabord. Par exemple,[1, 2, 3].map({"\($0)"}).joinWithSeparator(",")
Dmitry
3
@Dmitry N'utilisez pas l'interpolation de chaîne uniquement pour la conversion en chaîne. C'est beaucoup plus agréable d'utiliser un initialiseur sur String
Alexander - Reinstate Monica
130

Avec Swift 5, selon vos besoins, vous pouvez choisir l'un des exemples de codes Playground suivants afin de résoudre votre problème.


Transformer un tableau de Characters en un Stringsans séparateur:

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

print(string)
// prints "John"

Transformer un tableau de Strings en un Stringsans séparateur:

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

print(string) // prints: "BobDanBryan"

Transformer un tableau de Strings en un Stringavec un séparateur entre les mots:

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

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

Transformer un tableau de Strings en un Stringavec un séparateur entre les caractères:

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"

Transformer un tableau de Floats en un Stringavec un séparateur entre les nombres:

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"
Imanou Petit
la source
J'ai une chaîne qui ressemble à: "[1,2,3]". Existe-t-il un moyen de convertir facilement cela en un tableau [Int]? c'est-à-dire l'inverse de ce que fait la description.
user2363025
@ user2363025 uni peut utiliser le décodeur JSON. try JSONDecoder().decode([Int].self, from: Data(string.utf8))
Leo Dabus
48

Swift 2.0 Xcode 7.0 bêta 6 utilise à la joinWithSeparator()place de join():

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

joinWithSeparator est défini comme une extension sur 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
}
Siva
la source
23

Swift 3

["I Love","Swift"].joined(separator:" ") // previously joinWithSeparator(" ")
hardikdevios
la source
1
Je dirais que c'est ["I Love", "Swift"].
Join
15

Dans Swift 4

let array:[String] = ["Apple", "Pear ","Orange"]

array.joined(separator: " ")
Garçon Ankit
la source
11

Puisque personne n'a mentionné réduire, voici:

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

Dans l'esprit de la programmation fonctionnelle 🤖

éoniste
la source
3
Une bonne façon de faire les choses, grâce ... l' ajout d' une extrémité plus courte de la ligne de commande: [0,1,1,0].map{"\($0)"}.reduce("",+). 😉
XLE_22
@ XLE_22[0,1,1,0].map(String.init).joined()
Leo Dabus
8

Pour modifier un tableau de chaînes facultatives / non facultatives

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

Ici flatMap , compactMap ignore les valeurs nulles dans le tableau et ajoute les autres valeurs pour donner une chaîne jointe.

Agent Smith
la source
3
@YashBedi Dans Swift 4, nous utilisons compactMap au lieu de flatMap
Agent Smith
quelle signification de "$"?
Augusto
2
@Augusto Swift fournit automatiquement des noms d'arguments abrégés aux fermetures en ligne, qui peuvent être utilisés pour faire référence aux valeurs des arguments de la fermeture par les noms $ 0, $ 1, $ 2. Ici, $ 0 fait référence aux premiers arguments String de la fermeture.
Agent Smith
4

Le mien fonctionne sur NSMutableArray avec componentsJoinedByString

var array = ["1", "2", "3"]
let stringRepresentation = array.componentsJoinedByString("-") // "1-2-3"
Onur Var
la source
4

Dans Swift 2.2, vous devrez peut-être convertir votre tableau en NSArray pour utiliser componentsJoinedByString (",")

let stringWithCommas = (yourArray as NSArray).componentsJoinedByString(",")
Carlos Perez Perez
la source
Au fait, ce n'est qu'une traduction de objective-c en rapide.
Muhammad Zeeshan
3

Si vous souhaitez abandonner les chaînes vides dans le tableau.

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

Si vous souhaitez également filtrer les valeurs nulles:

["Jet", nil, "", "Fire"].flatMap { $0 }.filter { !$0.isEmpty }.joined(separator: "-")
Sourav Chandra
la source
1
très élégant, merci :)
CheshireKat
2
let arrayTemp :[String] = ["Mani","Singh","iOS Developer"]
    let stringAfterCombining = arrayTemp.componentsJoinedByString(" ")
   print("Result will be >>>  \(stringAfterCombining)")

Le résultat sera >>> Mani Singh Développeur iOS

Maninderjit Singh
la source
1

L'équivalent Swift de ce que vous décrivez est l'interpolation de chaînes. Si vous pensez à des choses comme JavaScript "x" + array, l'équivalent dans Swift est"x\(array)" .

En règle générale, il existe une différence importante entre l'interpolation de chaînes et le Printableprotocole. Seules certaines classes sont conformes Printable. Chaque classe peut être interpolée en quelque sorte. Cela est utile lors de l'écriture de fonctions génériques. Vous n'avez pas à vous limiter aux Printablecours.

Rob Napier
la source
1

Vous pouvez imprimer n'importe quel objet à l'aide de la fonction d'impression

ou utilisez \(name)pour convertir n'importe quel objet en chaîne.

Exemple:

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]"
123FLO321
la source
1

Créer une extension pour 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
        }
    }
}
Bartłomiej Semańczyk
la source
0

Un séparateur peut être une mauvaise idée pour certaines langues comme l'hébreu ou le japonais. Essaye ça:

// 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!)

Pour les autres types de données respectivement:

// 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!)
Alexey Chekanov
la source
0

si vous avez une liste de tableaux de chaînes, convertissez-la en Int

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

cela vous donnera une valeur de chaîne

Oshitha Wimalasuriya
la source
0

pour tout type d'élément

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;
    }
}
john07
la source
0

Essaye ça:

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: ",")
Tej Patel
la source
-1

POUR 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
    }
}
Ty Daniels
la source
-1

Si vous vous demandez quelque chose comme ceci: tobeFormattedString = ["a", "b", "c"] Output = "abc"

String(tobeFormattedString)

dheeru
la source
Non, ça ne marche pas. Stringn'a pas d'initialiseur capable de le faire. Soit vous utilisez une extension personnalisée ou une bibliothèque tierce, soit vous vous trompez tout simplement.
Eric Aya