【问题标题】:Immutable Value of "Struct" only only has mutating members named "Function"“结构”的不可变值只有名为“函数”的变异成员
【发布时间】:2015-08-29 23:30:40
【问题描述】:

我有一个错误,我一直在尝试解决,但找不到正确的解决方案。提前致谢!

struct PrizeItem {

    enum Rank {
        case Ok //Purple
        case Good //Blue
        case Epic //Green
        case Rare //Yellow
        case ExtremelyRare //Red
    }



    let name : String
    let description : String

    let rank : Rank


    let identifier : String

    let color : UIColor 

    var prizeIsActive : Bool! //<-- Important

    //Important Functions
    mutating func setToActive(){
        prizeIsActive = true
    }
    mutating func setToNotActive(){
        prizeIsActive = false
    }


}

现在当我尝试运行这个函数时:

func setPrizeToActive(prize:PrizeItem){

        prize.setToActive() <-- error here

    }

错误说明如下:

PrizeItem 类型的不可变值只有名为 setToActive 的变异成员

感谢您的帮助!

【问题讨论】:

  • 您应该将 Rich 的答案标记为正确。
  • 之前的答案不像你预期的那样工作。详情见我的回答。
  • 上面的代码提出了几个问题。为什么你想要只存在改变公共 Bool 值的函数?我也会质疑隐式展开 Bool 的想法...

标签: ios xcode swift ios8 xcode6


【解决方案1】:

较早的答案建议将其更改为:

func setPrizeToActive(var prize:PrizeItem){
    prize.setToActive() 
}

这解决了编译错误,但它没有做任何有用的事情。 prize 仍然是传入值的副本,即使 setToActive() 修改了这个副本,它也会立即被丢弃。如果要修改传递给setPrizeToActive 的结构,则prize 应标记为inout

func setPrizeToActive(inout prize: PrizeItem) {
    prize.setToActive()
}

并调用:

// make sure myprize is declared with var
setPrizeToActive(&myprize)

或者,您可以将PrizeItem 设为一个类。由于类是引用类型,传入的prize会按照你的预期进行修改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    相关资源
    最近更新 更多