簡體   English   中英

Swift意外錯誤無法分配給''in'self'

[英]Swift unexpected error Cannot assign to '' in 'self'

我有一個顏色數組,我試圖從它得到一個隨機顏色,而沒有連續相同的兩種顏色,並遇到一個錯誤的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
    }

我該如何解決?

我猜你的函數實際上是在代碼片段中沒有顯示的結構體內,問題是你沒有將函數聲明為mutating (即函數只能在使用let not var聲明的結構上調用,因為它會改變self) 。

為了清楚起見,我還建議將生成隨機數的邏輯分解為單獨的函數,並且還要減少需要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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM