Janghyup Lee Janghyup Lee - 6 months ago 11
Swift Question

EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, sub code=0x0). error while making data structure

I am practicing my array form of data structure with swift.

I made a class "student"

and there are functions like display() and delete()

However, the application is not working.

There is an error message that



EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, sub code=0x0).



I think this error is about "optional" problem.

Here is my code.

class student
{


var studentArray = [[String]?]()
var numberOfStudents : Int = 10;




func display()

{

for (var i = 0; i < numberOfStudents ; i++)

{

print("{");

for (var j = 0; j < 2; j++)

{

print(studentArray[i]![j] + " ");

}

print("}");


}

}


func delete( value : String)

{

var i = 0

for ( i = 0; i < numberOfStudents ; i++)


{



if (value == studentArray[i]![1])

{

break;

}


}


if (i == numberOfStudents - 1 )

{

print("not found");


}

else

{

for (var k = i; k < numberOfStudents - 1 ; k++)

{


studentArray[k]![1] = studentArray[k+1]![1];
studentArray[k]![0] = studentArray[k+1]![0];

}


numberOfStudents--;

}


}

}



var hello = student()


hello.studentArray = [["0","0ee"],["9","9ee", ]]
hello.display() // I have a error at this point

hello.studentArray


Could anyone explain what is about it for me?

Answer

There are several mistakes in your code. The actual error is caused by your numberOfStudents variable, which is hard coded to 10, even though the array only contains 2 elements. Use studentArray.count in your for loop, not 10. Then read the Swift manual. You should not be using optionals nor C-style for loops in this example.

Here's how I would do it...

class Student {                         // Capitalise your classes
                                        // Unnecessary whitespace removed
    var studentArray: [[String]] = []   // No need for optionals here
    /*              
    var numberOfStudents : Int =  10;   // var is useless & wrong, also no need for semi-colon  
    */        
    func display() {
        /* A Swift-ier way to do this is
         for student in studentArray {
             print("{")
             for field in student {
                 print(field + " ")
             }
             print("}")
         }
         However, using indexing:
         */
        for i in 0 ..< studentArray.count {
            print("{")
            for j in 0 ..< studentArray[i].count { // Don't *know* this will be 2
                print(studentArray[i][j] + " ")    // Don't need semi-colons unless you want to put multiple statements on the same line
            }
            print("}")
        }
    }
    /* func delete() not used in example, so removed from answer */
}

var hello = Student()

hello.studentArray = [["0","0ee"], ["9","9ee", ]] // Note spurious (but not wrong) comma
hello.display()

hello.studentArray