2015-07-07 2 views
0

Во-первых, извинения, если вопрос не имеет смысла, было сложно описать его правильно! Я довольно уверен в Objective-C, но для нового проекта мне пришлось взять Swift (что-то я очень опасался).Почему переменные клонов все еще влияют на исходный объект? SWIFT

В любом случае, я заметил что-то в простом учебнике tableViewController, который сводит меня с ума.

Сначала создается новый класс для каждой строки с переменной «text» и «checked». Затем массив состоит из объектов этого класса для заполнения строк таблицы.

Но в коде Tutorial производителя, он изменяет свойство «проверил» конкретной строки с помощью:

let item = items[indexPath.row] 
item.checked = !item.checked 

Где items[indexPath.row] просто выбирает нужный объект в массиве items. Это где я запутался, конечно, первая строка создает объект NEW clone, который никоим образом не связан с объектом в массиве?

Однако, при изменении любого из переменных item «s (например, как это меняет состояние item.checked, что изменение применяется к исходному объекту массива items[indexPath.row] который просто не имеет никакого логического смысла?

Конечно, я бы реализовать какая-то логика, чтобы это произошло, например:

items[indexPath.row] = item 

чтобы применить все изменения в item вернуться к исходному объекту Может кто-то пожалуйста, объясните это обратную связь, которая, по-видимому там

0?

Спасибо заранее, надеюсь, я просто пропустил что-то простое!

ответ

2

Посмотрите разницу между типами значений и ссылочными типами. В основном у вас есть ссылочный тип. Все классы являются ссылочными типами.

//new class init 
var myClassInstance : MyClass = MyClass() 

// this creates a new reference to the original object 
// changes will also happen to the original 
var myClone = myClassInstance 

Структуры, например, представляют собой типы значений. Они копируют значения и не привязаны к первоначальному

Работа вокруг:

Вы можете создать собственный инициализатор, который принимает все необходимые значения из исходного класса.

class MyCustomImageView : UIImageView { 

    override init(frame: CGRect) { 

     super.init(frame: frame) 
    } 

    init(uiImageView_I : UIImageView) { 

     super.init(frame:uiImageView_I.frame) 

     self.image = uiImageView_I.image 
    } 

    required init(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

} 

Когда вы вызываете пользовательский инициализатор вместо стандартного, вы будете создавать отдельные экземпляры каждый раз.

1

В Swift классы являются ссылочными типами, поэтому в этом случае нет «клонирования» - ссылка извлекается из массива, и свойства экземпляра, на который он указывает, изменяются. См. https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ClassesAndStructures.html#//apple_ref/doc/uid/TP40014097-CH13-ID89

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