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