2017-06-22 5 views
0

申し訳ありませんが、私はSwiftのノブで、まだ学習しています。Swift Xcodeエラー:タイプの値を変換できません

Xcodeから次のスウィフトコードのエラーメッセージが表示されます。「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

町の構造体を追加しました。 – 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

'Vampire(町:町?, monsterName:String)'のような初期化子は、パラメータラベルとそれに関連する型を宣言します。あなたがそれを呼び出すと、このタイプのインスタンスをそれぞれ渡す必要があります。初期化子 'init(population:Int、stoplights:Int)'を見てください。 'region'初期化子を呼び出し、それに応じてパラメータを渡します。 – vadian

+0

ありがとう! – user2959094

関連する問題