почему переменная класса не имеет значения в структуре в Swift - PullRequest
0 голосов
/ 24 февраля 2019

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

import Foundation

class Name {
    var name :String

    init(nname : String) {
        self.name = nname
    }
}

struct A {
    var NewName: Name
    var age: Int = 0

    init(nName: Name,nAge : Int){
        self.age = nAge
        self.NewName = nName
    }
}

var myName = Name(nname : "Sia")
var test1 = A(nName: myName,nAge:30)
var test2 = test1
print(test1.NewName)
print(test2.NewName)

output

__lldb_expr_182.Name
__lldb_expr_182.Name

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

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

Вы вообще не используете переменные класса, вы используете переменные экземпляра.Переменная class существует только один раз для всего класса.Переменная instance отличается для каждого экземпляра класса (или экземпляра структуры).Это просто сбивает с толку читателей вашего вопроса.

Большая разница между классом Swift и структурой Swift заключается в том, что классы ссылаются , а структуры значения .Когда вы назначаете myName = Name (nname: "Sia"), вы создаете экземпляр типа Name, а myName является ссылкой на этот экземпляр.

test1 - это вновь созданная структура.Он не содержит значение myName, он содержит ссылку.test2 также является недавно созданной структурой.Он не копирует весь объект Name из test1, он только копирует ссылку.test1 и test2 используют одну и ту же ссылку.

Если вы изменили myName.name = "abc", то значение внутри объекта, на который ссылается myName, будет изменено, поэтому при печати test1.NewName.name или test1.NewName.name будет напечатано "abc".

0 голосов
/ 24 февраля 2019

Поскольку Name является классом, значение свойства, хранящееся в структуре (NewName), является ссылкой на этот экземпляр класса.Когда вы копируете структуру в другую, вы копируете ссылочное значение (т. Е. Адрес в памяти, в которой хранится экземпляр).Следовательно, два свойства ссылаются на один и тот же экземпляр Name и показывают одно и то же значение печати (хотя две структуры имеют разные экземпляры).

EDIT : если вы имели в виду, почему он не печатает"Sia"

вы печатаете справочное значение, а не сохраненное в нем свойство.(NewName это не строка, а ссылка на класс)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...