Swift 无法转换类型为';()->_';到指定类型';城镇规模';
我发现这个结构有问题,在这行 “lazy var townSize:Size={”并且无法找出问题所在Swift 无法转换类型为';()->_';到指定类型';城镇规模';,swift,closures,Swift,Closures,我发现这个结构有问题,在这行 “lazy var townSize:Size={”并且无法找出问题所在 struct Town { let region = "South" var population = 5422 var numberOfStoplights = 4 enum Size { case Small case Medium case Large } lazy var townSi
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
}
}
您错误地声明了lazy var,它应该这样声明
lazy var townSize: Size = {
switch self.population {
case 0...10000:
return Size.Small
case 10001...100000:
return Size.Medium
default:
return Size.Large
}
}()
如前所述,要使用闭包初始化存储的属性,需要在该闭包括号后加上
()
:
lazy var townSize: Size = {
switch self.population {
case 0 ... 10000:
return .Small
case 10001 ... 100000:
return .Medium
default:
return .Large
}
}()
但是,由于population
是一个变量,而不是常数,因此您根本不希望townSize
成为存储属性。相反,您希望它是一个计算属性,以准确反映population
中的任何更改:
var townSize: Size {
switch population {
case 0 ... 10000:
return .Small
case 10001 ... 100000:
return .Medium
default:
return .Large
}
}
请注意缺少=
如果使用
惰性
存储属性,如果填充
在访问townSize
后发生更改,townSize
不会相应地反映这一点。但使用计算属性可以解决此问题。这是一个存储属性,初始化一次,但如果填充
以后发生更改,townSize
也不会自动更改。我怀疑他想要一个计算属性。为什么需要括号?还要注意,计算属性在被访问之前是不会计算的,因此它具有类似于懒惰的行为。