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?
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))
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)
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)
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)
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
Swift 4 solution:
// init empty tuple array
var myTupleArray: [(String, Int)] = []
// append a value
myTupleArray.append(("One", 1))
@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)
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)]