Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Swift optimization level breaks converting NSArray to Array

Tags:

swift

nsarray

The following (somewhat contrived) code works when Swift Optimization Level is set to None [-Onone] (default for debug):

    let nsa = NSArray(array: ["foo", "bar"])
    let a = nsa as [String]

But the app crashes (crash log) during run-time when set to Fastest [-O] (default for release).

I luckily discovered I can work around the issue by doing this:

    let a = nsa as [AnyObject] as [String]

My question is two-fold:

  1. Could you help me understand why this is happening?
  2. Is there a better way to convert an NSArray to an Array?

UPDATE

This does seem to be a bug. I have not reported it to Apple. If someone else would like to take the time to do so, please do!

like image 489
tybro0103 Avatar asked Dec 29 '14 19:12

tybro0103


1 Answers

It seems to be fixed on Xcode Version 6.3.1 (6D1002).

And, not an answer to your original problem but as the new Swift 1.2 introduced, as is a forced cast, now replaced by more explicit as!. You should expect an NSArray to Array<T> where T != AnyObject or NSObject to crash.

You'd better use conditional cast as?. Avoid ! any time it's possible.

let nsa = NSArray(array: ["foo", "bar"])
if let a = nsa as? [String] {
    println("a \(a)")
}
like image 87
Francescu Avatar answered Sep 20 '22 23:09

Francescu