2017-02-09 5 views
1

私は書籍からすぐに学び、構造体とクラスの例をタイプしました。しかし、この例はゾンビが呼び出されるたびに人口を減らさないため、このようには機能しません。私はこれが愚かな質問であることを知っていますが、私は理由を理解できません。誰かが何が間違っているのか説明できますか?だからここのコードです:override 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 
    } 
} 
関連する問題