Как включить опцию в массив в 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)]