Comment ajouter un tuple à un tableau Swift?

j'essaie d'ajouter un tuple (e.g., 2-item tuple) à un tableau.

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

Ce que j'obtiens est:

n'a pas Pu trouver une surcharge pour '+=' qui accepte fournis les arguments



Indice: j'ai essayé de faire une surcharge de l' '+=' 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 je n'ai pas eu droit.

des idées? ...la solution?

42
demandé sur Mo Abdul-Hameed 2014-06-15 23:03:45

8 réponses

Puisqu'il s'agit toujours de la meilleure réponse sur google pour ajouter des tuples à un tableau, il est intéressant de noter que les choses ont légèrement changé dans la dernière version. à savoir:

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

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

le composé opérateur d'affectation, +=, 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 lors de l'utilisation de append() sur un tableau contenant des tuples nommés, vous pouvez fournir chaque propriété du tuple que vous ajoutez comme argument à append():

stuff.append((name: "test 2", value: 2))
106
répondu Mike MacMillan 2016-02-17 19:55:06

Vous avez deux questions. Premier problème, vous ne créez pas un" tableau de tuples", vous créez un"tableau optionnel de tuples". Pour corriger cela, changez cette ligne:

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

à:

var myStringArray: (String,Int)[]

dans un Deuxième temps, vous êtes en train de créer une variable, mais ne lui donnant pas une valeur. Vous devez créer un nouveau tableau et l'assigner à la variable. Pour corriger cela, ajouter cette ligne après la première:

myStringArray = []

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

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

après cela, cette ligne fonctionne très bien et vous n'avez pas à vous soucier de surcharger les opérateurs ou autre folie. Vous avez terminé!

myStringArray += ("One", 1)

Voici la solution complète. Une de ses deux lignes et on n'a même pas changé:

var myStringArray: (String,Int)[] = []
myStringArray += ("One", 1)
10
répondu Alvin Thompson 2014-06-15 20:29:04

Si vous retirez l'option, il fonctionne très bien, sinon vous aurez à faire ceci:

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

if !myStringArray {
    myStringArray = []
}

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

Vous pouvez ne jamais ajouter un tableau vide, donc vous devrez l'initialiser à un certain point. Vous verrez dans l'opérateur de surcharge ci-dessous que nous le chargeons paresseusement pour s'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 appeler:

var myStringArray: (String,Int)[]? = nil
myStringArray += ("one", 1)
3
répondu Logan 2014-06-15 19:59:44

j'ai atterri ici plusieurs fois à cause de ce problème. Ce n'est pas aussi facile que je le voudrais avec un tableau de tuples. Voici un exemple de la façon dont je le fais maintenant.

définir un alias pour le point de clé de Tuple

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

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
répondu DogCoffee 2015-06-21 12:01:49

Note: Ce n'est pas travailler plus si vous n':

array += tuple 

vous obtiendrez une erreur ce que vous avez besoin est :

array += [tuple]

je pense que apple change à cette représentation parce que c'est plus logique

1
répondu Yank 2015-01-08 03:32:19

Swift 4 solution:

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

// append a value
myTupleArray.append(("One", 1))
1
répondu budidino 2018-03-27 03:25:05
 @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
répondu Christian Dietrich 2014-06-15 19:27:25

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:

nombres intéressants: [carré: [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) Numéro: 16

5) Nombre: 25

Premier

6) Nombre: 2

7) Numéro: 3

8) Numéro: 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) Numéro: 8





Tableau de tupules:

myStringArray: [(1), (Carré, 1), (Carré, 4), (Carré, 9), (Carré, 16), (Carré, 25), (Le Premier, 2), (Le Premier, 3), (Premier, 5), (Premier, 7), (Premier, 11), (Le Premier, 13), (Fibonacci, 1), (Fibonacci, 1), (Fibonacci, 2), (Fibonacci, 3), (Fibonacci, 5), (Fibonacci, 8)]

0
répondu Frederick C. Lee 2017-08-31 23:25:19