#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
изменения (поскольку это avar
),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)