2017-01-23 6 views
1

Мне нужно передать массив по ссылке (потому что вызываемая функция изменяет его, и изменения должны отражаться на сайте вызова). Поскольку Swift массивы передаются по значению и NSArrays, по ссылке, я попытался объявить функцию как:Как объявить NSArray определенного типа в Swift?

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

Но Xcode говорит, что я не могу специализировать без универсального типа NSMutableArray. Так что я должен:

func save(_ photos: NSMutableArray) { 

Это теряет безопасность типа. Есть ли способ, которым я могу обладать безопасностью типа и передавать по значению?

ответ

3

Вы не можете специализироваться на NSMutableArray - только Objective-C может сделать это (иронично, не так ли?). Однако вам это действительно не нужно.

Вместо этого просто объявите photos как inout [Photo]. Вы все равно будете передавать по значению, но вы сможете написать модифицированный массив обратно туда, откуда он пришел.

Простой пример:

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

Хм ... Спасибо. Я предпочитаю NSArray, потому что наличие двух массивов, даже временно, вызывает больше вопросов. Что произойдет, если какая-либо другая функция, вызванная в середине внешней функции, обратится к исходному массиву? Он не увидит сделанные обновления. Что-нибудь мне не хватает? –