【问题标题】:Index out of range (Can't get in the if condition)索引超出范围(无法进入 if 条件)
【发布时间】:2016-04-10 09:08:16
【问题描述】:

我正在制作一个词汇应用程序。用户将被要求选择一个日期,在点击其中一个日期后,prepareForSegue() 会将一个包含大约 30 个词汇的数组传递给 ViewController。然后这个viewController开始显示一个词汇标签,一秒钟后,它显示一个Image,再过一秒钟,它会显示词汇的含义。

这是我的代码。

class ViewController: UIViewController {

@IBOutlet weak var vocabImage: UIImageView!
@IBOutlet weak var meaningLabel: UILabel!
@IBOutlet weak var vocabLabel: UILabel!

var vocabData = [String]()
var meaningData = [String]()

var vocabNumber : Int = 0
var sceneNumber : Int = 0

var speed : Double = 0.01

var commentSwitch = false



var audioPlayer = AVAudioPlayer()



override func viewDidLoad() {
    super.viewDidLoad()

    controlTower()
        }

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


func controlTower()  {
    switch sceneNumber {
    case 0:

        if vocabNumber == 0 && commentSwitch == false{
            let myAlert = UIAlertController(title: "Lets start to memorize it,머리 속에 단어를 입력하는 단계", message: "뜻을 예측해 보자구요", preferredStyle: UIAlertControllerStyle.Alert)
            let myAlertAction = UIAlertAction(title: "Start", style: UIAlertActionStyle.Default, handler: { Void in
                self.commentSwitch = true
                self.controlTower()
            })
            myAlert.addAction(myAlertAction)
            presentViewController(myAlert, animated: true, completion:nil)

        }else{

        displayVocab()

        NSTimer.scheduledTimerWithTimeInterval(speed, target: self, selector: #selector(ViewController.controlTower), userInfo: nil, repeats: false)
        print("\(vocabNumber) - 0")
        sceneNumber = 1

        }
    case 1:
        displayImage()

        NSTimer.scheduledTimerWithTimeInterval(speed, target: self, selector: #selector(ViewController.controlTower), userInfo: nil, repeats: false)
        print("\(vocabNumber) - 1")
        sceneNumber = 2

    case 2:
        displayMeaning()

        NSTimer.scheduledTimerWithTimeInterval(speed, target: self, selector: #selector(ViewController.controlTower), userInfo: nil, repeats: false)
        print("\(vocabNumber) - 2")
        sceneNumber = 3


    case 3:
        if (vocabNumber  == vocabData.count ){

            deleteAll()
            sceneNumber = 0
            vocabNumber = 0
            print("I can't get in here")

        }else {




        deleteAll()
        sceneNumber = 0



        NSTimer.scheduledTimerWithTimeInterval(speed, target: self, selector: #selector(ViewController.controlTower), userInfo: nil, repeats: false)
            print("\(vocabNumber) - 3")

            controlTower()
            vocabNumber++


        }
    default: break

    }
}

func displayVocab() {
    //sound
    read()
    vocabLabel.text = vocabData[vocabNumber]

func displayImage() {
    vocabImage.image = UIImage(named: vocabData[vocabNumber])

func displayMeaning(){

    meaningLabel.text = meaningData[vocabNumber]
    }
}

所以每次在显示之前,它都会访问controlTower,不断显示数据,直到达到条件(vocabNumber == vocabData.count) && (scenenumber == 3)。

这是我的问题。当 vocabNumber 变为 31 (total data.count = 31) 它会得到 ​​p>

致命错误:索引超出范围

在 func displayVocab() {

    vocabLabel.text = vocabData[vocabNumber]
}

这里(我认为是vocabNumber)

我不知道为什么它不起作用。

即使我放了

if (vocabNumber <= vocabData.count){

在函数中,这还是不能得到case 3(if条件)

让我知道代码的哪一部分出现了这个错误。

谢谢。

【问题讨论】:

    标签: ios swift indexof


    【解决方案1】:

    vocabData.count 是元素的数量,但元素是从 0 到 count - 1。所以你必须检查 vocabData.count -1

    所以,在这种情况下:

    (vocabNumber == vocabData.count) && (scenenumber == 3)
    

    去:

    (vocabNumber == vocabData.count - 1) && (scenenumber == 3)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-16
      • 2018-03-02
      • 2016-09-16
      • 2019-09-24
      • 1970-01-01
      • 2018-03-01
      • 1970-01-01
      相关资源
      最近更新 更多