web-dev-qa-db-fra.com

Comment convertir un tableau Swift en chaîne?

Je sais comment le faire par programme, mais je suis sûr qu'il existe un moyen intégré ... 

Chaque langue que j'ai utilisée possède 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, que vous le transmettez à une fonction print (), etc. ont un moyen intégré de facilement transformer un tableau en chaîne, ou devons-nous toujours être explicite lors de la chaîne d'un tableau?

292
Troy

Si le tableau contient des chaînes, vous pouvez utiliser la méthode String de join:

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, blanc, virgule, etc.).

Sinon, vous pouvez simplement utiliser la propriété description, 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 protocole Printable a une propriété description. Si vous adoptez ce protocole dans vos propres classes/structures, vous les rendez également faciles à imprimer.

Dans Swift 3  

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

Dans Swift 4

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

Avec Swift 3, vous pouvez choisir l’un des blocs de code suivants, en fonction de vos besoins.


Conversion d'un tableau de Character en String sans séparateur:

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

print(string)
// prints "John"

Conversion d'un tableau de String en String sans séparateur:

let stringArray = ["Foo", "Bar", "Baz"]
let characterArray = stringArray.flatMap { String.CharacterView($0) }
//let characterArray = stringArray.flatMap { $0.characters } // also works
let string = String(characterArray)

print(string)
// prints "FooBarBaz"

Conversion d’un tableau de String en String avec un séparateur entre les mots:

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

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

Conversion d'un tableau de String en String avec un séparateur entre les caractères:

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

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

Conversion d'un tableau de Float en String avec un séparateur entre les nombres:

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

print(string)
// prints "12.0-14.6-35.0"
103
Imanou Petit

Swift 2.0 Xcode 7.0 beta 6 et versions ultérieures utilisent joinWithSeparator() au lieu 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
}
48
Siva

Swift 3  

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

Dans Swift 4

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

array.joined(separator: " ")
14
Ankit garg

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 nil dans le tableau et ajoute les autres valeurs pour obtenir une chaîne jointe.

7
Agent Smith

Puisque personne n’a mentionné réduire, le voici:

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

Dans l'esprit de la programmation fonctionnelle ????

6
eonist

Mine fonctionne sur NSMutableArray avec les composantsJoinedByString

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

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

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

Si vous voulez abandonner des 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: "-")
2
Sourav Chandra
let arrayTemp :[String] = ["Mani","Singh","iOS Developer"]
    let stringAfterCombining = arrayTemp.componentsJoinedByString(" ")
   print("Result will be >>>  \(stringAfterCombining)")

Le résultat sera >>> Mani Singh iOS Developer

2

L'équivalent Swift de ce que vous décrivez est l'interpolation de chaîne. Si vous pensez par exemple que JavaScript exécute "x" + array, l'équivalent dans Swift est "x\(array)".

De manière générale, il existe une différence importante entre l’interpolation de chaînes et le protocole Printable. Seules certaines classes sont conformes à Printable. Chaque classe peut être interpolée en chaîne d'une manière ou d'une autre. C'est utile lors de l'écriture de fonctions génériques. Vous n'êtes pas obligé de vous limiter à Printable classes.

1
Rob Napier

Créer une extension pour une 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
        }
    }
}

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: ",")
0
Tej Patel

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

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

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

il vous donnera une valeur de chaîne 

0

Vous pouvez imprimer n'importe quel objet en utilisant 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]"
0
123FLO321

Un séparateur peut être une mauvaise idée pour certaines langues telles que l'hébreu ou le japonais . Essayez ceci:

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