2014-12-18 4 views
2

색상 배열이 있는데 행에서 동일한 두 가지 색상을 가져 오지 않고 임의의 색상을 얻으려고하고 previousNumber = randomNumber Can not assign '자가'의 '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 
    } 

어떻게 수정합니까? 나는 당신의 기능을 추측하고

+0

코드는 놀이터에서 나를 위해 작동합니다. 우리는 더 많은 맥락이 필요할지도 모른다. (또한, while while 대신'do ... while' 루프를 사용하는 것을 고려해보십시오. arc4random_uniform을 호출하는 코드를 반복 할 필요가 없습니다.) –

+0

오류를 재현 할 수있는 유일한 방법은 다음과 같습니다. 'let'을 사용하여'var'보다는'previousNumber'를 선언하면됩니다. 이것이 당신의 정확한 코드라고 확신합니까? –

답변

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() 
+0

돌연변이가 잘됩니다! 감사 – ackratos

관련 문제