QA@IT

Swift2 配列を削除する、removeAtIndex()について質問です

2599 PV

こんばんわ初めまして。
貴重な質問を出来るこの機会に大変感謝しています。

早速質問なのですが、
問題[1.2.3]をランダムで選択し、出題した後にその選択された問題をremoveAtIndex()を使って削除したいのですが、
うまく問題が削除されません。何故でしょうか?コードは以下になります。

func questioning(){

    //問題を配列に入れる
var items = [newQuestion1,newQuestion2, newQuestion3]
let q1 = Int(arc4random()) % items.count

    //問題を出す
items[q1]()
    //選ばれた問題を削除
let _ = items.removeAtIndex(q1)
}

お時間がある時にいつでも構いませんので、よろしくお願いします。

  • 削除されないのではなくて、その関数が呼ばれるたびにitemsにすべての問題を入れているからとかではないですか? -
  • 回答ありがとうございます。
    どうゆう事でしょうか?
    items[newQuestion1]
    ということでしょうか?
    -
  • いや、関数の先頭でitemsに3つの要素を持つリストを代入しているので
    var items = [newQuestion1,newQuestion2, newQuestion3]
    直後ではitems.countは常に3です。

    さらにremoveAtIndexより後でitemsを使っていません。
    どこを見て「問題が削除されない」と感じたのでしょうか?
    -

回答

itemsはquestioningの先頭で毎回初期化されるので
questioningを複数回呼び出しても削除されたようには見えません。
let _ = items.removeAtIndex(q1)の直後で2件にはなっていますが、それは引き継がれません。

例えば以下のようにitemsを外で作成する必要があります。

import UIKit

func abc(inout items:[(Void->Void)]){
    let q1 = Int(arc4random()) % items.count
    items[q1]()
    let _ = items.removeAtIndex(q1)
}

func qA(){ print("qA") }
func qB(){ print("qB") }
func qC(){ print("qC") }
var items=[qA,qB,qC]

abc(&items)
abc(&items)
編集 履歴 (0)
  • 遅くなって申しわけありませんでした。分かりやすい回答ありがとうございます。
    解決いたしました。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。