In the context of Swift code,
EXC_BAD_INSTRUCTION
usually means you’ve hit a compiler trap, that is, an undefined instruction inserted into the code by the compiler because of a bug detected at runtime. The most common cause of these are:
Line 3 in your snippet is doing a bunch of different things, all of which might cause this trap:
if
cell
is nil, cell?.viewWithTag(1)
will be nil and the forced cast will failif there’s no view with tag 1,
viewWithTag(_:)
will return nil and the forced cast will failif the view with tag 1 leads to something other than a UILabel, the forced cast will fail
If you split the code up into separate lines you can tease these apart and find the problem.
I also recommend that you change your style a little. Within your code snippet
cell
really can’t be nil. If it is, you’ll trap at the unforced unwrap when you return (line 6 in your snippet). If you’re going to trap anyway, you might as well trap early, so you could write this:
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell")!
let label1 = cell.viewWithTag(1) as! UILabel //that's the line of the error
label1.text = messages[indexPath.row].messageBody
return cell
Note how by adding the forced unwrap on line 1, you get rid of one on line 4 and get rid of the
?
on line 3. Better.
Even better you could write this:
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
where UIKit guarantees to not give you back nil.
When dealing with optionals, your goạl should be to limit the scope of those optionals as much as possible. That way you only have to unwrap once, so you can only fail in one place, which makes all your other code simpler.
Share and Enjoy
—
Quinn “The Eskimo!”
Apple Developer Relations, Developer Technical Support, Core OS/Hardware
let myEmail = "eskimo" + "1" + "@apple.com"