2016-04-12 10 views
8

この構造体で、 "lazy var townSize:Size = {"問題が何であるか把握してください。'() - > _'型の値を 'Town.Size'の指定された型に変換できません

struct Town { 

    let region = "South" 
    var population = 5422 
    var numberOfStoplights = 4 

    enum Size { 
     case Small 
     case Medium 
     case Large 
    } 

    lazy var townSize: Size = { 
     switch self.population { 
     case 0...10000: 
      return Size.Small 
     case 10001...100000: 
      return Size.Medium 
     default: 
      return Size.Large 
     } 
    } 

    func printTownDescription() { 
     print("Population: \(myTown.population), number of stoplights: \(myTown.numberOfStoplights)") 
    } 

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

答えて

8

あなたは間違ってそれを閉鎖して保存されたプロパティを初期化するために、指摘されたように、あなたはは、閉じカッコの後()を必要とし、この

lazy var townSize: Size = { 
     switch self.population { 
     case 0...10000: 
      return Size.Small 
     case 10001...100000: 
      return Size.Medium 
     default: 
      return Size.Large 
     } 
    }() 
+0

これは一度初期化されるストアドプロパティですが、 'population'が後で変更された場合、' townSize'も自動的には変更されません。彼は計算された財産を望んでいると思う。 – Rob

+2

意味がありますが、間違った怠惰なvar構文が私に騙されました:) –

6

のように宣言されなければならない怠惰なVARを宣言:

lazy var townSize: Size = { 
    switch self.population { 
    case 0 ... 10000: 
     return .Small 
    case 10001 ... 100000: 
     return .Medium 
    default: 
     return .Large 
    } 
}() 

しかし、​​は定数ではなく変数であるため、townSizeはすべて格納されたプロパティにする必要はありません。代わりに、あなたは正確に​​の変更を反映するために、それは計算されたプロパティになりたい:

var townSize: Size { 
    switch population { 
    case 0 ... 10000: 
     return .Small 
    case 10001 ... 100000: 
     return .Medium 
    default: 
     return .Large 
    } 
} 

=の欠如に注意してください。

あなたはlazy保存されたプロパティを使用している場合は

townSizeにアクセス後に​​の変更は、 townSizeはそれに応じてこれを反映しない場合。しかし、計算されたプロパティを使用すると、この問題は解決されます。

+0

また、計算されたプロパティはアクセスされるまで計算されないので、怠惰なような動作をします。 – bitsoverflow

関連する問題