Как включить опцию в массив в Swift

Я хочу добавить опцию в массив следующим образом

let arr: AnyObject[] = [1, 2, nil, 4, 5]

Следующее выражение генерирует ошибку компиляции, говорящую

Cannot convert the expression type 'AnyObject[]' to type 'AnyObject'

Как я могу сделать эту работу? Мне нужно дополнительное или нулевое значение в массиве, хотя я знаю, что не должен.

Ответ 1

Если вы собираетесь вставлять либо Int, либо nil s, используйте

Swift < 2.0

var arr: Int?[] = [1, 2, nil, 4, 5]

Swift >= 2.0

var arr: [Int?] = [1, 2, nil, 4, 5]

Swift 3x

var arr: Array<Int?> = [1, 2, nil, 4, 5]

Это можно сделать для любого типа (а не только Int, то есть, если вы хотите, чтобы array сохранял определенный тип, но допускал, чтобы он был пустым в некоторых показателях, например, в коробке с яйцами.)

Ответ 2

Точно так же:

let arr: AnyObject?[] = [1, 2, nil, 4, 5]

он создает массив типа AnyObject?

Ответ 3

Вы не можете использовать AnyObject:

 18> let ar : AnyObject?[] = [1, 2, nil, 4, 5]
<REPL>:18:25: error: cannot convert the expression type 'AnyObject?[]' to type 'AnyObject?'
let ar : AnyObject?[] = [1, 2, nil, 4, 5]
                        ^~~~~~~~~~~~~~~~~

Но вы можете использовать Any:

 18> let ar : Any?[] = [1, 2, nil, 4, 5]
ar: Any?[] = size=5 {
  [0] = Some {
    Some = <read memory from 0x7f8d4b841dc0 failed (0 of 8 bytes read)>
  }
  [1] = Some {
    Some = <read memory from 0x7f8d50da03c0 failed (0 of 8 bytes read)>
  }
  [2] = Some {
    Some = nil
  }
  [3] = Some {
    Some = <read memory from 0x7f8d4be77160 failed (0 of 8 bytes read)>
  }
  [4] = Some {
    Some = <read memory from 0x7f8d4be88480 failed (0 of 8 bytes read)>
  }
}

В документации Apple это ясно:

"Swift предоставляет два специальных псевдонима типа для работы с неспецифическими Типы:
  o AnyObject может представлять экземпляр любого типа класса.
  o Любой может представлять экземпляр любого типа вообще, кроме типов функций.

Отрывок из: Apple Inc." Быстрый язык программирования ". интерактивные книги. https://itun.es/us/jEUH0.l

Похоже, что Int и, возможно, другие примитивные типы не являются подтипами типа класса и, следовательно, AnyObject не будет работать.

Ответ 4

let ar: AnyObject[] = [1,2,nil,3] является незаконным, поскольку nil не конвертируется в AnyObject.

let a: AnyObject?[] = [1,3,nil,2] или let a: Int?[] = [1,3,nil,2] работает.

Если вам понадобится Objective-C мостовой массив, используйте

let a: AnyObject[] = [1, 2, NSNull(), 4, 5]

Ответ 5

Это чит, но если вы используете ноль в качестве дозорного, было бы целесообразно просто использовать Tuples, один элемент - Bool, чтобы отразить действительность второго.

var arr = [(true, 1), (true, 2) , (false, 0) , (true, 4),(true,5)]