我从一本书中学得很快,并输入了一个结构和类的例子。然而,该示例并不像它应该的那样工作,因为无论何时调用僵尸,程序都不会减少人口。我知道这是一个愚蠢的问题,但我无法理解为什么。有人能解释一下是什么错吗?所以这里是代码:
main.swift
import Foundation
var myTown = Town()
myTown.changePopulation(by:500)
let fredTheZombie = Zombie()
fredTheZombie.town = myTown
fredTheZombie.terrorizeTown()
fredTheZombie.town?.printDescription()
myTown.printDescription()
Town.swift
import Foundation
struct Town {
var population = 5422
var numberOfStopLights = 4
func printDescription() {
print("Population: \(myTown.population), number of stoplights: \ . (myTown.numberOfStopLights).")
}
mutating func changePopulation(by amount: Int){
population += amount
}
}
Monster.swift
import Foundation
class Monster{
var town: Town?
var name = "Monster"
func terrorizeTown(){
if town != nil{
print("\(name) is terrorazing a town!")
}
else{
print("\(name) hasn't found a town to terrorize yet...")
}
}
}
Zombie.swift
import Foundation
class Zombie: Monster {
override func terrorizeTown() {
town?.changePopulation(by: -10)
super.terrorizeTown()
}
}
答案 0 :(得分:1)
由于Town
是一个结构体,因此在将其指定给僵尸时会复制它。因此,fredTheZombie.terrorizeTown()
会恐吓myTown
的副本 - 所以myTown
会保留其价值。
你想要的是一个课程,当你将它分配给你的怪物时,它会被参考转移 - 所以你只有一个城镇:
class Town {
var population = 5422
var numberOfStopLights = 4
func printDescription() {
print("Population: \(myTown.population), number of stoplights: \ . (myTown.numberOfStopLights).")
}
func changePopulation(by amount: Int){
population += amount
}
}
答案 1 :(得分:1)
如果您将Town从结构改为类,它将起作用。
每次分配时都会复制一个结构,所以当你把zombie.town = myTown放在同一个城镇时,僵尸会有一个城镇的副本,当僵尸的城镇更新时,原来的城镇不会改变。课程将以您期望的方式运作。