Swift 无法转换类型为';()->_';到指定类型';城镇规模';

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

我发现这个结构有问题,在这行 “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 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
也不会自动更改。我怀疑他想要一个计算属性。为什么需要括号?还要注意,计算属性在被访问之前是不会计算的,因此它具有类似于懒惰的行为。