2017-02-09 175 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 
    } 
}