Я новичок в Swift и сейчас пытаюсь решить проблему. Мне нужно создать struct
и вывести статус userRichard
на консоль. Единственная проблема заключается в том, что оператор печати, который я использовал для isActive
, не работает для userRichard.name
, он оставляет эту часть пустой при выводе isActive
на консоль.
Почему это?
struct User {
let name: String
var email: String?
var followers: Int
let isActive: String
init(name: String, email: String?, followers: Int, isActive: String) {
self.name = name
self.email = email
self.followers = followers
self.isActive = isActive
logStatus()
}
func logStatus() {
print("\(userRichard.name) is \(isActive)")
}
}
var userRichard = User(name: "Richard", email: "[email protected]", followers: 0, isActive: "not active")
//prints: is not active
Кажется, я знаю, что здесь происходит...
Давайте разберем, что у вас есть в вашем коде:
Все, что находится между крайними фигурными скобками, здесь связано со структурой User. Вы правильно настроили все свойства, и инициализатор выглядит хорошо. Пока игнорируйте вызов logStatus() в инициализаторе.
Затем у вас есть объявление метода logStatus, которое может применяться к каждому экземпляру User, который вы создаете.
struct User {
let name: String
var email: String?
var followers: Int
let isActive: String
init(name: String, email: String?, followers: Int, isActive: String) {
self.name = name
self.email = email
self.followers = followers
self.isActive = isActive
logStatus()
}
func logStatus() {
print("\(userRichard.name) is \(isActive)")
}
}
Так в чем проблема?
Я думаю, что проблема здесь в том, что вы вызываете функцию logStatus() внутри инициализатора до того, как она успела завершиться.
Если вы реструктурируете свой код следующим образом, он будет работать:
struct User {
let name: String
var email: String?
var followers: Int
let isActive: String
init(name: String, email: String?, followers: Int, isActive: String) {
self.name = name
self.email = email
self.followers = followers
self.isActive = isActive
}
func logStatus() {
print("\(name) is \(isActive)")
}
}
var userRichard = User(name: "Richard", email: "[email protected]", followers: 0, isActive: "not active")
userRichard.logStatus()
Я удалил «userRichard» из бита .name функции logStatus(). Это означает, что если вы вызовете его для любого экземпляра структуры User, он покажет соответствующее имя.
Затем я вызвал функцию для экземпляра userRichard пользователя — после того, как он был инициализирован. Тот же подход также должен работать, если вы создали отдельный экземпляр «userPete» и так далее.
Надеюсь, это имеет смысл.
Большое спасибо за такой информативный ответ, он мне очень помогает. Мир!
В вашем конструкторе вы вызываете
logStatus()
, и в этот моментuserRichard
пусто, поэтому оно не выводит правильное значение. Возможно, вы имели в видуname
вместоuserRichard.name
там?