2016-05-19 2 views
-3

Мне нужно вернуть копию объекта с помощью Swift, но я не могу понять, как это сделать.Swift: Возвращение копии объекта

Это, как я буду делать это в Objective-C:

-(NSArray*) doingSomethingwith 
{ 
    NSArray *myArray = @[@"a",@"b",@"c",@"d",]; 

    return [myArray copy]; 
} 

Любой из вас знает, как это сделать Swift?

Я по-настоящему благодарю вашу помощь.

+0

Вы хотите знать, как вернуть копию NSArray или как вернуть любую копию объекта? – pableiros

ответ

3

Если содержимое массива является объектами значений, так как константные строки находятся в вашем примере, просто верните его; Быстрые задания имеют поведение при копировании. Это объясняется в конце документации Classes And Structures Apple:

Назначение и копирования поведения для струнных, Массивы, и словари

В Swift, многие основные типы данных, такие как String, Array, и словарь реализованы как структуры. Это означает, что данные, такие как строки, массивы и словари, копируются, когда они назначаются новой константе или переменной или когда они передаются функции или методу.

Это поведение отличается от: NSString, NSArray и NSDictionary реализованы как классы, а не структуры. Строки, массивы и словари в Foundation всегда назначаются и передаются как ссылка на существующий экземпляр, а не как на копию.

ПРИМЕЧАНИЕ. Описание выше относится к «копированию» строк, массивов и словарей. Поведение, которое вы видите в коде, всегда будет таким, как если бы копия имела место. Однако Swift выполняет только фактическую копию за кулисами, когда это абсолютно необходимо сделать. Swift управляет копированием всех значений, чтобы обеспечить оптимальную производительность, и вам не следует избегать назначения, чтобы попытаться устранить эту оптимизацию.

Если ваш массив содержит ссылочные объекты, и вы хотите вернуть их глубокую копию, это немного сложнее; here's a discussion о том, как обращаться с этим. Несмотря на то, что правильный способ обработки этого кода - это повторить код для использования типов значений.

-1

Swift не принимает ссылки. Таким образом, вы можете напрямую вернуть массив.

+1

Это неправда. Если у вас есть массив типов Swift, то прямое возвращение массива не создает глубокую копию. Обе копии по-прежнему будут ссылаться на один и тот же объект, а изменение одного также изменит другое. –

+0

@WillM. Верно. Но давайте получим быстрый массив и nsmutablearray, и если мы передадим его другому контроллеру (например, выполните segue) и попробуем их отредактировать, быстрый массив не изменится в предыдущем контроллере, но он будет изменен в nsmutablearray в предыдущем контроллере. Проверьте ответ здесь. http://stackoverflow.com/questions/36208709/creating-a-mutable-dictionary-in-swift –

+0

И пример, на который он ссылался, если он непосредственно возвращает массив, это не вызовет никаких проблем, потому что каждый раз новый массив создается. –

1

Вы могли бы сделать что-то вроде этого.

let myArray: NSArray = ["a","b","c","d"] 

func returnCopyOfArray() -> NSArray{ 
return myArray 
} 
+0

Это только «работает», потому что они не изменяемы. Все копии по-прежнему указывают на одни и те же объекты, а не на настоящие копии. Вы можете сказать, напечатав адрес памяти myArray [0] и первый элемент вашей копии. –

Смежные вопросы