Quelqu'un peut-il s'il vous plaît éclaircir cela pour moi.
Je comprends (pense) Swift
passe des arrays par valeur car c'est une structure.
Mais quand je passe un tableau via segue au controller de vue suivant, il me semble qu'il passe par reference, comme quand je vérifie l'adresse memory du tableau, ils sont les mêmes.
C'est comme ça que je vérifie
println("\(unsafeAddressOf(runs))") // 0x0000000174240c00
J'aurais pensé que ces adresses de memory seraient différentes? Ou suis-je juste me confondre.
Les classs Run / StaffTask héritent toutes deux de NSObject à des fins de sauvegarde.
class Run: NSObject, NSCoding { }
De plus, si j'accède à un élément du tableau
var service = self.staffTasks[indexPath.row]
et éditez la valeur, la valeur de la variable de service et l'élément dans le tableau sont mis à jour. Ils ont la même adresse memory, comme indiqué par
println("\(unsafeAddressOf(service)) \(unsafeAddressOf(self.staffTasks[indexPath.row]))")
Aussi…
StaffTasks sont un sous-set d'un plus grand tableau appelé runs
Lorsque je search l'object de service, avec le plus grand set, je trouve qu'ils sont également la même adresse de memory
if let index = find(self.runs, self.staff) { println("local \(unsafeAddressOf(self.staff)) main list \(unsafeAddressOf(self.runs[index]))") }
J'utilise NSCoding pour save mes objects, alors j'ai pensé que je devrais find l'object de service dans le plus grand set, replace cet object et ensuite les sauvegarder.
Mais il s'avère que je n'en ai pas besoin, je suis capable d'éditer la variable de service et le tableau des exécutions est automatiquement mis à jour … comme le serait un type de reference.
Qui passe? .. Réglage du Var
pour préparer le segue, il suffit de définir la variable locale dans le second VC en utilisant la méthode standard, var runsInSecondVC = runs. Ne pas utiliser, & pointeurs ou toute autre bizarrerie.
Merci pour toute aide.
Détails de base de la class
class Run: NSObject, NSCoding { var runDate:NSDate! var staffName:Ssortingng! var staffEmail:Ssortingng! var runTasks:[StaffTask]! } class StaffTask: NSObject, NSCoding { var taskName:Ssortingng var taskTime:NSInteger var clientName:Ssortingng! }
Ce sont les bases de ces classs. Rien de compliqué.
passe les arrays par valeur
Non. Les arrays Swift sont un type de valeur . Cela ne veut pas dire qu'ils sont évalués par valeur. Cela signifie que vous pouvez muter un tableau à l'aide d'une reference sans affecter les autres references auxquelles ce tableau a été affecté.
Vous obtenez un peu confus sur le tableau lui-même et le contenu du tableau.
..si j'accède à un élément du tableau
var service = self.staffTasks[indexPath.row]
et éditez la valeur, la valeur de la variable de service et l'élément dans le tableau sont mis à jour. Ils ont la même adresse memory …
Mettre un object dans un tableau ne copy pas l'object. En fait, le tableau contient une reference à l'object, de sorte que la ligne ci-dessus indique réellement "faire un service
variable qui contient une reference à l'object que self.staffTasks[indexPath.row]
contient comme reference". Il n'y a qu'un seul object, auquel il est maintenant fait reference à deux endroits, donc lorsque vous mettez à jour l'object, ce changement est visible à travers les deux variables.