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

10

我在这个结构体中遇到了问题,在读取“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
    }
}
2个回答

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
        }
    }()

这是一个存储属性,只初始化一次,但如果 population 后来发生变化,townSize 不会自动改变。我猜他想要一个计算属性。 - Rob
为什么需要括号? - Oscar

11

如前所述,要使用闭包初始化存储属性,需要在闭合大括号后添加()

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
    }
}

注意缺少=符号。

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


另外请注意,计算属性在访问之前不会被计算,因此它具有类似于lazy的行为。 - bitsoverflow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接