2017-06-22 58 views
0

對不起,我是Swift的noob,仍然在學習。Swift Xcode錯誤:無法轉換類型的值

我從Xcode收到以下swift代碼的錯誤消息:「無法將類型'Town?.Type'(又名'Optional.Type')的值轉換爲期望的參數類型'Town?'」

class Vampire: Monster { 

    var vampirePopulation: [Vampire] = [] 

    override func terrorizeTown() { 
     if town?.population > 1 { 
     town?.changePopulation(-1) 
     } else { 
     town?.population = 0 
     } 
     vampirePopulation.append(Vampire(town: Town?, monsterName: String)) 
     print("\(vampirePopulation.count) vampires") 
     super.terrorizeTown() 
    } 

} 

這裏的怪物等級:

import Foundation 

class Monster { 
    static let isTerrifying = true 
    class var spookyNoise: String { 
     return "Grrr" 
    } 
    var town: Town? 
    var name = String() 
    var victimPool: Int { 
     get { 
      return town?.population ?? 0 
     } 
     set(newVictimPool) { 
      town?.population = newVictimPool 
     } 
    } 
    init(town: Town?, monsterName: String) { 
     self.town = town 
     name = monsterName 
    } 
    func terrorizeTown() { 
     if town != nil { 
      print("\(name) is terrorizing a town!") 
     }else { 
      print("\(name) hasn't found a town to terrorize yet..") 
     } 
    } 
} 

這裏是城市結構:

import Foundation 

struct Town { 
var mayor: Mayor? 
let region: String 
var population: Int { 
    didSet(oldPopulation) { 
if population < oldPopulation 
{ 
    print("The population has changed to \(population) from \ 
(oldPopulation).") 
    mayor?.mayorResponse() 
} 
} 
} 



var numberOfStoplights: Int 
init(region: String, population: Int, stoplights: Int) { 
self.region = region 
self.population = population 
numberOfStoplights = stoplights 
} 
init(population: Int, stoplights: Int) { 
    self.init(region: "N/A", population: population, stoplights: 
stoplights) 
} 

enum Size { 
    case Small 
    case Medium 
    case Large 
} 
var townSize: Size { 
    get { 
    switch self.population { 
    case 0...10000: 
     return Size.Small 

    case 10001...100000: 
     return Size.Medium 

    default: 
     return Size.Large 
    } 
} 
} 
func printTownDescription() { 
    print("Population: \(population); number of stoplights: \ 
(numberOfStoplights); region: \(region)") 
} 

mutating func changePopulation(_ amount: Int) { 
population += amount 
} 
} 

爲什麼我收到此錯誤訊息?

+0

顯示'Town'類。 – nayem

+0

我添加了Town結構。 – user2959094

回答

2

的錯誤是很清楚

Cannot convert value of type 'Town?.Type' (aka 'Optional.Type') to expected argument type 'Town?

意味着你傳遞一個,而不是類型的實例

而不是Town?town

vampirePopulation.append(Vampire(town: town, monsterName: name)) 
+0

但是,然後我得到相同的錯誤,但對於monsterName:String。 當我將monsterName:String更改爲monsterName:name時,所有錯誤消失。我知道你告訴我需要爲參數傳遞一個類型的實例,但是你能解釋爲什麼嗎?我想明白我爲什麼要這樣做。謝謝! – user2959094

+1

像「吸血鬼(城鎮:鎮?,monsterName:String)」這樣的初始化程序聲明瞭參數標籤和關聯的類型。當你調用它時,你必須分別傳遞這個類型的實例。查看初始化程序'init(population:Int,stoplights:Int)'。它調用'region'初始化器並相應地傳遞參數。 – vadian

+0

非常感謝! – user2959094

相關問題