2017-02-09 179 views
1

我正在从书中学习迅速并键入结构和类的示例。然而这个例子并不像它应该的那样工作,因为只要僵尸被调用,程序不会减少人口数量。我知道这是一个愚蠢的问题,但我不明白为什么。有人可以解释什么是错的吗?因此,这里的代码:覆盖func不起作用

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() 
} 
} 

回答

1

如果从结构改变镇它将工作的类。

每次分配一个结构体时,所以当你把zombie.town = myTown它不是同一个城镇时,僵尸有一个城镇的副本,当僵尸的城镇不变更新。一个班级将以您期望的方式工作。

+0

谢谢!我尝试了所有我能想到并且没有想过的事情。 –

+0

没问题!如果已经解决了问题,请将答案标记为已接受,谢谢 – simonWasHere

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 
    } 
}