Swift:调用数组内类型转换后对象的mutating方法报错如何解决
解决Swift中协议数组调用值类型mutating方法的问题
报错原因
出现该错误的核心原因:
- 数组
[myprotocol]存储的是值类型(结构体myType),通过下标访问myArrayFromEarlier[3]时,返回的是该元素的不可变临时副本(默认是let常量)。 - 强转为
myType后,这个副本依然是不可变状态,而mutating方法需要修改实例本身,因此编译器禁止调用。
解决方法
直接取出元素转为可变变量,修改后再放回数组即可:
// 取出目标元素并转为可变变量 var mutableItem = myArrayFromEarlier[3] as! myType // 调用mutating方法修改状态 mutableItem.mutateState() // 将修改后的元素放回原数组 myArrayFromEarlier[3] = mutableItem
类型安全优化(可选)
如果可以修改协议定义,建议在myprotocol中声明mutating方法,避免强制类型转换的风险:
protocol myprotocol { mutating func mutateState() } struct myType: myprotocol { var state = 0 mutating func mutateState(){ state += 1 } }
此时无需强转即可调用方法,逻辑和之前一致:
var mutableItem = myArrayFromEarlier[3] mutableItem.mutateState() myArrayFromEarlier[3] = mutableItem
内容的提问来源于stack exchange,提问作者Boothosh81
相关产品推荐
相关产品推荐

