“结构”的不可变值只有名为“函数”的变异成员
Posted
技术标签:
【中文标题】“结构”的不可变值只有名为“函数”的变异成员【英文标题】: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 的想法... 【参考方案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
会按照你的预期进行修改。
【讨论】:
以上是关于“结构”的不可变值只有名为“函数”的变异成员的主要内容,如果未能解决你的问题,请参考以下文章
不可变值类型 [string] 只有名为 append 的变异成员
不能对不可变值使用变异成员:函数调用返回不可变值 - 不确定为啥值是不可变的
Swift 2在协议扩展中使用变异函数时出错“无法在不可变值上使用变异成员:'self'是不可变的