2015-01-08 3 views
0

사용자 기본값에서 목록을 검색하고이 목록에없는 임의의 번호를 생성하여이 번호를 목록에 추가하고 다시 저장하려고합니다.Swift - 검색된 목록에없는 임의의 번호 생성

내 기능은 다음과 같습니다

func createRandiAndSaveNumberToCell()->Double{ 

    var defaults = NSUserDefaults.standardUserDefaults() 

    var numbersList: [Int] = [] 

    if let firstNameIsNotNill = defaults.objectForKey("usedNumbersList") as? [Int] { 
     numbersList = defaults.objectForKey("usedNumbersList") as [Int] 
    } 

    var randomNumb = Int(arc4random_uniform(10)) 

    while contains(numbersList, randomNumb){ 
     randomNumb = Int(arc4random_uniform(10)) 
    } 
    numbersList.append(randomNumb) 
    defaults.setObject(numbersList, forKey: "usedNumbersList") 

    var randi = Double(randomNumb) 
    println(numbersList) 

return randi 
} 

을이이 같은 목록을 반환 : 첫 번째 목록으로

[13, 26, 75, 35, 57, 23, 6, 0, 74, 69, 38, 30, 3, 29, 52, 62, 46, 42, 37, 55, 65, 9, 18, 49, 15, 40, 71, 20, 44, 67, 43, 21, 33, 59, 8, 1, 63, 68, 2, 5] 

을, 모든 번호가 추가되고, 그것은 또한 전에 3 개 개의 숫자를 추가합니다 이 번호. 숫자가 반복되지 않더라도, 내가 찾던 결과가 아니므로이 임의의 숫자를 생성하는 함수가 잘못된 것처럼 보이는지 알아야합니다.

진행 방법에 대한 의견을 보내 주시면 감사하겠습니다.

+0

테스트 해 보셨습니까? 그것은 작동하는지 확인하는 가장 쉬운 방법 인 것 같습니다 : P 또한, 올바르게 작동하는 것처럼 보입니다. while 루프를 사용하고 목록에없는 하나가 될 때까지 숫자를 계속 생성하십시오. 그게 니가 의미하는 것 같아. – Kendel

+0

"이 숫자 앞에 3 개의 숫자를 더하십시오"라고 설명해주십시오. 조금 더 설명이 맞지 않습니다. 또한, 작성된 것처럼이 코드는 너무 멀리 떨어져 있지 않지만 조금만 최적화 할 수 있습니다. 가장 큰 문제는 0에서 9 사이의 임의의 숫자를 선택하는 것이며 반환 된 목록의 숫자는 훨씬 높습니다. 이 함수를 11 번 호출하면 무한 루프가 발생합니다. –

+0

배열 대신 사전을 생각해보십시오. 키는 고유하며 키가 이미 있는지 테스트 할 수 있습니다. –

답변

1

사용자 기본값은 프로그램 실행에 따라 유지됩니다. 아마도 당신은 (이전 시도를 통해) 당신이 제공 한 목록의 가치를 저장할 수있었습니다.

코드를 신선한 Swift 콘솔 앱에 붙여 넣으십시오. usedNumbersList에 이미 10 개의 숫자가 모두 포함되어 있기 때문에 최대 10 회까지 올바르게 작동하면 무한 루프가됩니다. 따라서 while 루프가 종료되지 않습니다.

왜 코드에서 무한 루프가 발생하지 않고 설명하는 동작이 조금 이상합니다. 원인은 질문에서 제공하는 함수 외부의 코드 일 수 있습니다. 그러나 당신이이 상태를 감지하고 그것을 어떤 식 으로든 처리 할 수 ​​있어야하는 것처럼 보입니다.

func randomNotIn(source: [Int], #upperBound: UInt32) -> Int { 
    // detect possible infinte loop 
    precondition(source.count < Int(upperBound)) 

    // by making this a do…while, you can scrap the double-assignment: 
    var candidate: Int // you don’t _have_ to give a var a value 
    do { 
     // so long as the compiler can see it’s guaranteed to be 
     // assigned a value before it’s first used 
     candidate = Int(arc4random_uniform(upperBound)) 
    } while contains(source, candidate) 

    return candidate 
} 

당신이 당신의 임의을 테스트 할 수 있습니다이 방법 : 당신이하지 주어진 목록에서 임의의 숫자를 생성 한 두 가지 기능을 하나로 분할하는 경우

그런데

, 당신은 아마 디버깅이 코드를 쉽게 찾아 낼 것 - 숫자 생성 기능을 가져 오기/저장 코드에서 독립적으로 (아마도 놀이터에서 시도해보십시오.)

+0

이전 코드와 똑같은 코드를 구현했지만 코드가 완벽하게 작동합니다. 기고 해 주셔서 감사합니다. 이제 원래 코드가 작동하지 않는 이유를 알 수 있습니다. :) – martin