2017-01-23 2 views
1

J'ai besoin de passer un tableau par référence (parce que la fonction appelée le modifie, et les changements devraient être reflétés sur le site d'appel). Comme les tableaux Swift sont passés par valeur et NSArrays, par référence, j'ai essayé de déclarer la fonction comme:Comment déclarer un tableau NSArray d'un type spécifique dans Swift?

func save(_ photos: NSMutableArray<Photo>) { 

Mais Xcode dit que je ne peux pas se spécialiser un type non générique NSMutableArray. Donc je dois faire:

func save(_ photos: NSMutableArray) { 

Cela perd la sécurité de type. Y at-il un moyen que je peux avoir à la fois le type de sécurité et de passer par la valeur?

Répondre

3

Vous ne pouvez pas spécialiser NSMutableArray - seulement Objective-C peut le faire (ironique, n'est-ce pas?). Cependant, vous n'avez pas vraiment besoin de le faire.

Au lieu de cela, simplement déclarer photos comme inout [Photo]. Vous passerez toujours par la valeur, mais vous serez en mesure d'écrire le tableau modifié à l'endroit d'où il vient.

Exemple simple:

var originalArray = [1,2,3] 
func modifyArray(_ array: inout [Int]) { 
    array = Array(array.dropFirst()) 
} 
modifyArray(&originalArray) 
originalArray // [2,3] 
+0

Hmm ... Merci. Je préfère NSArray, car avoir deux tableaux, même temporairement, soulève plus de questions. Que se passe-t-il si une autre fonction appelée au milieu de la fonction externe accède au tableau d'origine? Il ne verra pas les mises à jour effectuées. Quelque chose que je manque? –