swift - 如何修复 Xcode 中的“不能在不可变值上使用变异成员:'self' is immutable”错误
问题描述
我创建一个随机数并将其分配给变量randomNumber
。然后,当我尝试将随机数作为emojis
数组的索引附加到空数组arrayOfEmojis
时,出现错误:
'不能对不可变值使用变异成员:'self' 是不可变的'
我也从表情符号中得到错误?
import GameKit
struct EmojiProvider {
var emojis = ["", "", "", "", "", "", "", "", "☺️", "", "", "", "", "", "", ""]
var arrayOfEmojis: [String]
func generateEmoji() -> [String] {
for i in 1...3 {
var randomNumber = GKRandomSource.sharedRandom().nextInt(upperBound: emojis.count)
arrayOfEmojis.append(emojis[randomNumber]) //error!
}
return arrayOfEmojis
}
}
解决方案
发生这种情况是因为当您拥有 astruct
而不是 aclass
时,您正在改变实例本身。
因此,当您尝试 mutate 时self
,将函数标记为mutating
:
mutating func generateEmoji() -> [String] {
另外,我建议您选择一个随机元素,如下所示:
return (1...3).compactMap { _ in emojis.randomElement() }
...arrayOfEmojis
如果您以后不想访问它,请留下我们的整体。
完整的代码将是:
struct EmojiProvider {
var emojis = ["", "", "", "", "", "", "", "", "☺️", "", "", "", "", "", "", ""]
mutating func generateEmoji() -> [String] {
return (1...3).compactMap { _ in emojis.randomElement() }
}
}
您还可以做的是创建EmojiProvider
一个类,而不是一个结构。
然后,您可以拥有以下代码:
class EmojiProvider {
var emojis = ["", "", "", "", "", "", "", "", "☺️", "", "", "", "", "", "", ""]
func generateEmoji() -> [String] {
return (1...3).compactMap { _ in emojis.randomElement() }
}
}
推荐阅读
- android-studio - Android studio 刚下载,报错
- javascript - Vue.js 从组件中删除 div
- machine-learning - 数据收集过程的目标是什么?
- activemq - ActiveMQ - 限制队列中未决消息的数量而不影响生产者
- python-2.7 - python-sockets:通过不同的网络发送数据
- r - Shiny -- 'ggsave' 打印的图看起来与闪亮的应用程序中显示的图不同
- android - 动态下载字体文件并用于Android和IOS
- python - 两个列表中所有元素的乘法
- html - 从角度 6 中的另一个组件传递值后,如何动态检查复选框?
- javascript - Vue路由器自动在路径上添加哈希