Swift意外错误无法分配给''in'self'

bma*_*iel 2 ios swift

我有一个颜色数组,我试图从它获得一个随机颜色,而没有连续相同的两种颜色,并遇到一个错误,因为previousNumber = randomNumber说不能分配给'self'中的'previousNumber'

var previousNumber: UInt32?

    func generateRandomNumber() -> Int {
        var coloursArrayLength = UInt32(coloursArray.count)
        var randomNumber = arc4random_uniform(coloursArrayLength)
        while previousNumber == randomNumber {
            randomNumber = arc4random_uniform(coloursArrayLength)
        }
        previousNumber = randomNumber
        var randomNumberInt = Int(randomNumber)
        return randomNumberInt
    }
Run Code Online (Sandbox Code Playgroud)

我该如何解决?

Air*_*ity 7

我猜你的函数实际上是在代码片段中未示出一个结构里面,问题是你有没有声明的功能mutating(即功能只能叫上宣称结构let不会var因为它发生变异个体经营).

为了清楚起见,我还建议将生成随机数的逻辑分解为单独的函数,并且还要减少需要var这么多:

func generateRandom(#upTo: UInt32, #notRepeatOf: UInt32?) -> UInt32 {
    // bear in mind though that you might need to handle if your coloursArray has one entry...
    precondition(upTo > 1 || notRepeatOf == nil , "avoid infinite loop")
    while true {
        let candidate = arc4random_uniform(upTo)
        if candidate != notRepeatOf { return candidate }
    }
}

struct S {
    var previousNumber: UInt32? = nil
    let coloursArray = [1,2,3,4]

    // note mutating keyword, fixes the "cannot
    // assign to self.previousNumber" error
    mutating func generateRandomNumber() -> Int {
        let newNumber = generateRandom(upTo: UInt32(coloursArray.count), notRepeatOf: previousNumber)
        previousNumber = newNumber
        return Int(newNumber)
    }
}

// if you declare the struct with let,
let a = S()
// it won’t let you call mutating funcs
// "Immutable value of type 'S' only has mutating members named 'generateRandomNumber'"
a.generateRandomNumber()

// have to declare with var
var b = S()
b.generateRandomNumber()
Run Code Online (Sandbox Code Playgroud)