Ошибка инициализатора свойств Swift/SwiftUI в структуре

#swift #xcode #debugging #struct #swiftui

Вопрос:

<Я понимаю, что подобные вопросы уже задавались, но у них очень сложные вопросы или недостаточные ответы (я новичок в swift)>

Я привел очень простой пример, который обобщает мою проблему

 struct Greeting {

    var name = "Bob"
  
    var message = "Hi, "   name
}

var a = Test("John")
print(a.message)
 

Я получаю следующую ошибку:

ошибка: не удается использовать элемент экземпляра » имя «в инициализаторе свойств; инициализаторы свойств запускаются до того, как будет доступно «я»

Я попытался инициализировать значения, создать свое лучшее предположение о ленивых значениях и сделать так, чтобы значения vars вычислялись. Любая помощь будет признательна!

Комментарии:

1. Весь исполняемый код, например print(a.message) , должен находиться внутри функции. Если только вы не используете игровые площадки Swift.

2. Вы используете SwiftUI, верно? Вы можете поместить var a = Test("John"); print(a.message) внутрь onAppear .

Ответ №1:

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

 struct Greeting {
    var name = "Bob"

    var message: String {
        "Hi, "   name
    }
}
 

Комментарии:

1.Просто небольшая опечатка (уже отредактированная и исправленная) — вы, включая = so, не были вычисляемым свойством. Не стал бы компилировать, но хороший ответ! Я думаю, что это лучше, потому что, если name изменения (поскольку это a var ), message также изменяются / имеют правильное значение при вызове, чего нет в принятом ответе.

Ответ №2:

Вы получаете ошибку, потому что в Swift вам нужно придать переменным некоторое значение, прежде чем вы сможете их использовать.

    struct Greeting {
        var name = "Bob"      // <-- this variable is initialized with "Bob"
        var message: String   // <-- this var is not, you need to initialize it yourself
                             // which means you cannot use this before you give it a value
        
        // a very common approach is to have your own initializer function init.
        init(name: String, message: String) {
            self.name = name    // <-- this is initialized (again in our case)
            self.message = "Hi "   name  // this is now initialized the way you want it
        }

       // you can have many customized init, like this
       init() {
          // here because name is already initialized with Bob, it's ok
          self.message = "Hi "   name
       }
        
        // if you don't have a init function, swift creates a basic one (or more) for you
        // but it will not be the special one you wanted, like above.
    }
 

Поэтому при создании приветствия сначала вызывается функция инициализации. Это то место, где вы можете настроить создание приветствия. До этого вы не можете использовать переменную «имя», как в «сообщении var = «Привет»,» имя».

Вы можете использовать его вот так:

         let greet = Greeting()
        print(greet.message)