无法将'() - > _'类型的值转换为指定类型'Town.Size'

pde*_*ger 10 closures swift

我在这个结构中遇到了这个问题,在"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
    }
}
Run Code Online (Sandbox Code Playgroud)

Pet*_*r K 11

你错误地声明了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
        }
    }()
Run Code Online (Sandbox Code Playgroud)

  • 有道理,但错误的懒惰var语法欺骗了我:) (2认同)

Rob*_*Rob 11

如前所述,要使用闭包初始化存储的属性,您需要()在该闭包之后:

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

但是,因为population是变量而不是常量,所以根本不想townSize成为存储属性.相反,您希望它是一个计算属性,以准确反映以下内容中的任何更改population:

var townSize: Size {
    switch population {
    case 0 ... 10000:
        return .Small
    case 10001 ... 100000:
        return .Medium
    default:
        return .Large
    }
}
Run Code Online (Sandbox Code Playgroud)

注意缺乏=.

如果您使用lazy存储的属性,如果population访问后更改townSize,townSize则不会相应地反映这一点.但是使用计算属性可以解决这个问题.