This is correct (albeit unintuitive at first) behaviour, and is a result of id-as-Any. See the following thread for more info:
Regarding your example with the array:
let array: [AnyObject] = []
if array is [Int] {
print("// yes [AnyObject] is [Int]")
}
it's worth noting that currently empty arrays can be cast to any array type. For example:
let array: [String] = []
if array is [Int] {
print("yup")
}
// prints: yup
There's some discussion of this behaviour in the comments of SR-6192.