2017-11-10 6 views
1

나는 퀴즈 프로젝트를 진행하고 있습니다. 그러나 지금은 질문을 섞어 배열에서 개별 항목을 선택하는 것이 어렵습니다. 아래 코드를 찾으십시오.질문을 섞어 배열의 한 항목을 표시하는 방법

내 카테고리의 선택 컨트롤러는 다음과 같습니다

struct Quiz { 
private(set) var name = String() 
private(set) var plist: NSArray 



init(name: String) { 
self.name = name 
plist = NSArray(contentsOfFile: Bundle.main.path(forResource: name, ofType: "plist")!)! 

} 

static let quizzes = [Quiz(name: "Development"), Quiz(name: "Reflexes")]} 

내 퀴즈 컨트롤러는 내가 여기에 대한 도움을 주셔서 감사합니다 것

Plist image is here

을 다음과 같이

override func viewDidLoad() {  
super.viewDidLoad() 


set = shuffledQuiz([[Quiz.quizzes[currentTopicIndex].plist]]) 

quiz = set.objectEnumerator() 


pickQuestion() 
} 

func shuffledQuiz(_ name: [[NSArray]]) -> NSArray{ 
if currentSetIndex < name.count { 
    return name[currentSetIndex].shuffled() as NSArray 
} 
return NSArray()} 

func pickQuestion() { 

if let quiz = quiz?.nextObject() as? NSArray { 
    print(quiz) 

    let questionLabel: [String] = quiz.value(forKeyPath: "question") as! NSArray as! [String] 

    print(questionLabel) 
    self.questionLabel.text = questionLabel.description 

    let correctAnswer: [Int] = quiz.value(forKey: "Answer") as! NSArray as! [Int] 
    print(correctAnswer) 
    let answers = quiz.value(forKeyPath: "options") as! NSArray 

    print(answers) 


    for i in 0..<answersButtons.count { 
     answersButtons[i].setTitle((answers[i] as AnyObject).localizedName, for: .normal) 
    } 
    remainingQuestionsLabel.text = "\(set.index(of: quiz) + 1)/\(set.count)" 
} 
else { 
    endOfQuestionsAlert() 
} 
} 

내 PLIST이입니다. 고맙습니다.

답변

1

셔플을 Fisher-Yates 사용하십시오.

기본 알고리즘은 다음과 같습니다

  1. 당신의 unshuffled 배열로 시작하고 빈 단행 배열입니다.
  2. 순서가 바뀌지 않은 배열에서 요소를 임의로 선택하십시오.
  3. 셔플이 적용되지 않은 배열에서 제거하고이를 셔플 된 배열 끝에 추가하십시오.
  4. 순서가 바뀌지 않은 배열이 비어있을 때까지 2 단계와 3 단계를 반복하십시오.
  5. 셔플 된 배열을 반환합니다.

  1. 배열의 요소의 수를 변수 (n)를 설정 한 다음의 알고리즘을 사용하여 "대신에"셔플 배열 할 수있다.
  2. n
  3. 반복에서 요소 n - 1
  4. 빼기 10 ..< n (사용 arc4random_uniform())
  5. 스왑 요소 x에 임의의 숫자 x를 선택하는 것은 제로 2 n까지 4 단계를 반복합니다.
관련 문제