web-dev-qa-db-fra.com

Comment ajouter un tuple à un tableau Swift?

J'essaie d'ajouter un tuple (par exemple, un tuple à 2 éléments) à un tableau.

var myStringArray: (String,Int)[]? = nil
myStringArray += ("One", 1)

Ce que je reçois, c'est:

Impossible de trouver une surcharge pour '+ =' qui accepte les arguments fournis


Hint: J'ai essayé de surcharger le '+ =' par livre de référence:

@assignment func += (inout left: (String,Int)[], right: (String,Int)[]) {
    left = (left:String+right:String, left:Int+right+Int)
}

... mais ne l'ont pas bien compris.

Des idées? ...Solution?

47
Frederick C. Lee

Comme c'est toujours la meilleure réponse sur Google pour ajouter des n-uplets à un tableau, il est à noter que les choses ont légèrement changé dans la dernière version. à savoir:

lors de la déclaration/instanciation de tableaux; le type est maintenant imbriqué entre les accolades:

var stuff:[(name: String, value: Int)] = []

l'opérateur d'assignation composé, +=, est maintenant utilisé pour concaténer des tableaux; si vous ajoutez un seul élément, il doit être imbriqué dans un tableau:

stuff += [(name: "test 1", value: 1)]

il est également intéressant de noter que lorsque vous utilisez append() sur un tableau contenant des tuples nommés, vous pouvez fournir chaque propriété du nuplet que vous ajoutez en tant qu'argument à append():

stuff.append((name: "test 2", value: 2))
118
Mike MacMillan

Vous avez deux problèmes. Premier problème, vous ne créez pas un "tableau de tuples", vous créez un "tableau facultatif de tuples". Pour résoudre ce problème, changez cette ligne:

var myStringArray: (String,Int)[]? = nil

à:

var myStringArray: (String,Int)[]

Deuxièmement, vous créez une variable, mais ne lui donnez pas de valeur. Vous devez créer un nouveau tableau et l'affecter à la variable. Pour résoudre ce problème, ajoutez cette ligne après la première:

myStringArray = []

... ou vous pouvez simplement changer la première ligne en ceci:

var myStringArray: (String,Int)[] = []

Après cela, cette ligne fonctionne correctement et vous n’aurez plus à vous soucier de surcharger les opérateurs ou d’autres folies. Vous avez terminé!

myStringArray += ("One", 1)

Voici la solution complète. Un énorme deux lignes et une n'a même pas été changé:

var myStringArray: (String,Int)[] = []
myStringArray += ("One", 1)
12
Alvin Thompson

Si vous supprimez l'option, cela fonctionne correctement, sinon vous devrez le faire:

var myStringArray: (String,Int)[]? = nil

if !myStringArray {
    myStringArray = []
}

var array = myStringArray!
array += ("One", 1)
myStringArray = array

Vous ne pouvez jamais ajouter un tableau vide, vous devrez donc l'initialiser à un moment donné. Vous verrez dans l'opérateur de surcharge ci-dessous que nous le chargeons en quelque sorte pour nous assurer qu'il n'est jamais nul.

Vous pouvez condenser ceci en un opérateur '+ =':

@assignment func += (inout left: Array<(String, Int)>?, right: (String, Int)) {

    if !left {
        left = []
    }

    var array = left!
    array.append(right.0, right.1)
    left = array

}

Puis appelez:

var myStringArray: (String,Int)[]? = nil
myStringArray += ("one", 1)
3
Logan

Je me suis retrouvé ici plusieurs fois à cause de ce problème. Pas toujours aussi facile que je voudrais avec ajouter sur un tableau de n-uplets. Voici un exemple de la façon dont je le fais maintenant.

Définir un alias pour le tuple - point clé

typealias RegionDetail = (regionName:String, constraintDetails:[String:String]?)

tableau vide

var allRegionDetails = [RegionDetail]()

Facile à ajouter maintenant

var newRegion = RegionDetail(newRegionName, constraints)
allRegionDetails.append(newRegion)

var anotherNewRegion = RegionDetail("Empty Thing", nil)
allRegionDetails.append(anotherNewRegion)
2
DogCoffee

Swift 4 solution:

// init empty Tuple array
var myTupleArray: [(String, Int)] = []

// append a value
myTupleArray.append(("One", 1))
2
budidino

Note: ça ne marche plus si tu fais:

array += Tuple 

vous obtiendrez une erreur ce dont vous avez besoin est:

array += [Tuple]

Je pense Apple changer cette représentation parce que c'est plus logique

1
Yank
 @assignment func += (inout left: Array<(String, Int)>?, right: (String, Int)) {
    if !left {
        left = []
    }   
    if left {
        var array = left!
        array.append(right.0, right.1)
        left = array
    }
}

var myStringArray: (String,Int)[]? = nil
myStringArray += ("x",1)
0
Christian Dietrich

Merci aux commentaires:

import UIKit

@assignment func += (inout left: Array<(String, Int)>?, right: (String, Int)) {
    if !left {
        left = []
    }
    if left {
        var array = left!
        array.append(right.0, right.1)
        left = array
    }
}

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        let interestingNumbers = [
            "Prime": [2, 3, 5, 7, 11, 13],
            "Fibonacci": [1, 1, 2, 3, 5, 8],
            "Square": [1, 4, 9, 16, 25],
        ]

        println("interestingNumbers: \(interestingNumbers)\n")
        var largest = 0

        var myStringArray: (String,Int)[]? = nil

        myStringArray += ("One", 1)

        var x = 0

        for (kind, numbers) in interestingNumbers {
            println(kind)
            for number in numbers {
                if number > largest {
                    largest = number
                }
                x++
                println("\(x)) Number: \(number)")
                myStringArray += (kind,number)
            } // end Number
        } // end Kind
        println("myStringArray: \(myStringArray)")
    }
}

Le résultat:

interestNumbers: [Square: [1, 4, 9, 16, 25], Prime: [2, 3, 5, 7, 11, 13], Fibonacci: [1, 1, 2, 3, 5, 8]]

Carré
1) Nombre: 1
2) Nombre: 4
3) Nombre: 9
4) Nombre: 16
5) Nombre: 25
Premier
6) Nombre: 2
7) Nombre: 3
8) Nombre: 5
9) Nombre: 7
10) Nombre: 11
11) Nombre: 13
Fibonacci
12) Nombre: 1
13) Nombre: 1
14) Nombre: 2
15) Nombre: 3
16) Nombre: 5
17) Nombre: 8



Tableau de tupules:

myStringArray: [(One, 1), (Square, 1), (Square, 4), (Square, 9), (Square, 16), (Square, 25), (Prime, 2), (Prime, 3) (Prime, 5), (Prime, 7), (Prime, 11), (Prime, 13), (Fibonacci, 1), (Fibonacci, 1), (Fibonacci, 2), (Fibonacci, 3), ( Fibonacci, 5), (Fibonacci, 8)]

0
Frederick C. Lee