【问题标题】:Left side of mutating operator isn't mutable: 'visiter' is a 'let' constant? WHY?变异运算符的左侧不可变:“访问者”是“让”常量?为什么?
【发布时间】:2020-12-13 17:54:06
【问题描述】:

在我试图从客人的钱中减去成本时,当我尝试时抛出错误“变异运算符的左侧不可变:'访问者'是一个'让'常量”使用运算符 -= 但为什么?我将它声明为变量!我能做些什么?入口函数和bar函数抛出错误:

struct ClubGuest: Guest {
    var name: String
    var money: Double
    var onDrugs: Bool
}
var mikel = ClubGuest(name: "Mikel", money: 50.5, onDrugs: false)
var angelina = ClubGuest(name: "Angelina", money: 400, onDrugs: true)
var steve = ClubGuest(name: "Steve", money: 100.80, onDrugs: true)
var july = ClubGuest(name: "July", money: 1050, onDrugs: false)

struct Club: Party {
    var name: String
    var location: String
    var entryPrice: Double
    var guests: [Guest]
    var maximumguests: Int
    var revenue = 0.0
    mutating func entry(visiter: Guest) {
        if visiter.money > entryPrice && guests.count < maximumguests {
            guests.append(visiter)
            visiter.money -= entryPrice
            revenue += entryPrice
        } else {
            stop()
        }
        GuestCheckUP(guest: visiter)
    }
    
    mutating func Bar(guest: Guest, drink: Drink) {
        print("\(guest) want to buy a drink")
        if guest.money >= drink.price {
            guest.money -= drink.price
        revenue += drink.price
        print("\(guest.name) bought a \(drink.name) for \(drink.price)$, now he/she has \(guest.money)$ in his/her pocket")
        } else {
            print("\(guest.name) has too less money for a drink!")
        }
    }
    
    
    mutating func GuestCheckUP(guest: Guest) {
        if guest.onDrugs {
            throwOut(visiter: guest)
            
        }
    }
    
    
    mutating func throwOut(visiter: Guest) {
        print("\(visiter.name) was throwed out by the security!")
    }
    
    func stop() {
        print("Stop! No entry!")
    }
    func Earnings() {
        print("The earnings of tonight are \(revenue)$")
    }
}

【问题讨论】:

    标签: swift function struct operators


    【解决方案1】:

    请注意,Guest 是一种协议,而不是一种类型。您应该首先确保在您的 Guest 协议中声明 money 属性以要求设置器,使您的方法通用并为其添加 inout 关键字:

    protocol Guest {
        var money: Double { get set }
        // your code
    }
    

    mutating func entry<T: Guest>(visiter: inout T) {
        // your code
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-02
      • 1970-01-01
      • 2021-08-22
      • 2016-12-04
      • 2021-11-28
      • 1970-01-01
      • 2016-08-20
      相关资源
      最近更新 更多