Я новичок в Swift и статическом программировании. Пройдя через книгу Большого старческого ранха Свифт. Что я не понимаю, так это то, почему население MyTown меняется, но не fredTheZombie.town? Упражнение требует, чтобы население города никогда не опускалось ниже нуля. Это может произойти, когда население меньше 10. Как изменить переменную популяции fredTheZombie.town?Swift - Изменение переменной внутри структуры?
struct Town {
var population = 5422
var numberOfStoplights = 4
func printTownDescription() {
print("Population: \(myTown.population), number of stoplights: \(myTown.numberOfStoplights)")
}
mutating func changePopulation(amount: Int) {
population += amount
}
}
class Monster {
var town: Town?
var name = "Monster"
func terrorizeTown() {
if town != nil {
print("\(name) is terrorizing a town!")
} else {
print("\(name) hasn't found a town to terrorize yet...")
}
}
}
class Zombie: Monster {
var walksWithLimp = true
final override func terrorizeTown() {
guard town?.population > 0 else {
return
}
if town?.population > 10 {
super.town!.changePopulation(-10)
} else {
super.town!.population = 0
}
super.terrorizeTown()
}
func changeName(name: String, walksWithLimp: Bool) {
self.name = name
self.walksWithLimp = walksWithLimp
}
}
var myTown = Town()
myTown.changePopulation(500)
let fredTheZombie = Zombie()
fredTheZombie.town = myTown
fredTheZombie.terrorizeTown()
fredTheZombie.town?.printTownDescription()
fredTheZombie.changeName("Fred the Zombie", walksWithLimp: false)
myTown.changePopulation(-5915)
print(myTown.population)
print(fredTheZombie.town!.population)
fredTheZombie.terrorizeTown()
fredTheZombie.terrorizeTown()
fredTheZombie.town?.printTownDescription()
Выход:
Monster is terrorizing a town!
Population: 5922, number of stoplights: 4
7
5912
Fred the Zombie is terrorizing a town!
Fred the Zombie is terrorizing a town!
Population: 7, number of stoplights: 4
Program ended with exit code: 0
Это имеет смысл. Есть ли способ изменить fredTheZombie.town, не превращая его в тот же экземпляр (myTown)? – ltrainpr
@ltrainpr Вы можете назначить любую из своих переменных или вызвать метод мутации. Однако, поскольку 'fredTheZombie.town' является необязательным, он не будет работать, потому что результат разворачивания снова является копией. Наиболее распространенный способ работы с типами значений - всегда создавать новый экземпляр. – Sulthan
@ltrainpr О, я вижу вашу проблему сейчас, позвольте мне отредактировать ответ. – Sulthan