首页 > 解决方案 > 如何修复 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
    }
}

标签: swift

解决方案


发生这种情况是因为当您拥有 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() }
    }
}

推荐阅读