Структуры: Swift Playground не печатает имя пользователя

Я новичок в 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

В вашем конструкторе вы вызываете logStatus(), и в этот момент userRichard пусто, поэтому оно не выводит правильное значение. Возможно, вы имели в виду name вместо userRichard.name там?

AlBlue 13.12.2020 20:40
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
101
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Кажется, я знаю, что здесь происходит...

Давайте разберем, что у вас есть в вашем коде:

Все, что находится между крайними фигурными скобками, здесь связано со структурой 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» и так далее.

Надеюсь, это имеет смысл.

Большое спасибо за такой информативный ответ, он мне очень помогает. Мир!

Mervan 13.12.2020 17:42

Другие вопросы по теме