Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 覆盖函数不';行不通_Swift_Overriding - Fatal编程技术网

Swift 覆盖函数不';行不通

Swift 覆盖函数不';行不通,swift,overriding,Swift,Overriding,我正在从一本书中学习swift,并键入了一个结构和类的示例。然而,这个例子并没有像它应该的那样工作,因为程序不会在每次调用僵尸时减少人口。我知道这是个愚蠢的问题,但我就是不明白为什么。谁能解释一下怎么了?下面是代码: 梅因·斯威夫特 import Foundation var myTown = Town() myTown.changePopulation(by:500) let fredTheZombie = Zombie() fredTheZombie.town = myTown fred

我正在从一本书中学习swift,并键入了一个结构和类的示例。然而,这个例子并没有像它应该的那样工作,因为程序不会在每次调用僵尸时减少人口。我知道这是个愚蠢的问题,但我就是不明白为什么。谁能解释一下怎么了?下面是代码:

梅因·斯威夫特

import Foundation

var myTown = Town()
myTown.changePopulation(by:500)

let fredTheZombie = Zombie()
fredTheZombie.town = myTown
fredTheZombie.terrorizeTown()
fredTheZombie.town?.printDescription()
myTown.printDescription()

斯威夫特镇

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

怪物,斯威夫特

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...")
    }
}
}

僵尸,斯威夫特

import Foundation

class Zombie: Monster {

override func terrorizeTown() { 
town?.changePopulation(by: -10)
super.terrorizeTown() 
}
}


由于
城镇
是一个结构,当您将其分配给僵尸时,它将被复制。因此,
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
    }
}

如果将Town从结构更改为类,它将起作用


每次指定结构时都会复制它,因此,当您放置zombie.town=myTown时,它不是同一个城镇,僵尸拥有城镇的副本,并且在更新僵尸的城镇时不会更改原始城镇。一节课会按照你期望的方式进行。

谢谢!我尝试了所有我能想到的事情,但没有想到这一点。