2016-08-29 2 views
-1

Предположим, я хочу иметь данные массива od, в которых хранятся либо целые числа, либо nils. Например:Как сохранить значение nil после разворачивания необязательно?

[1,2,3,nil,5,nil,7]

Как сделать это с помощью УСТРОЙСТВА? Когда я играю с ним всегда в конечном итоге с:

[optional(1),optional(2)...]

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

Как перебирать значения и добавлять в массив как развернутые значения, так и nils, если это происходит?

+3

Вы можете использовать 'flatMap' http://stackoverflow.com/a/32876707/2227743 – Moritz

+0

Итак ... вы хотите« распечатать »массив следующим образом:' [1,2,3, nil, 5, nil, 7] 'вместо этого:' [optional (1), optional (2) ...] '. Я вас правильно понял? – Sweeper

+0

Это именно то, что я хочу сделать. Поскольку мне нужно отслеживать, какое значение равно nil – DCDC

ответ

0

Ваш вопрос не имеет смысла. Вы сохраняете nil, чтобы иметь «пустой» элемент. Итак, вам все равно нужно проверить каждый элемент на nil.

Просто следуйте хорошо известный дополнительный обязательный шаблон:

var array: [Int?] = [1,2,3,nil,5,nil,7] 
if let element = array[3] { 
    //do smtng 
} 

или отбросить все nil от

let nilFree = array.flatMap{$0} 
//[1,2,3,5,7] 

заказ печати Array<Optional<T>> Например:

print(array.map {nullable -> AnyObject in return nullable ?? "nil"}) 
//[1, 2, 3, nil, 5, nil, 7] 
+0

Я хочу, чтобы хранить пустые элементы, это случай – DCDC

+0

@DCDC использовать опции. Пожалуйста, предоставьте реальный случай, когда у вас есть проблемы с этим. Кроме того, попробуйте подумать о типе массива, который вы хотите построить. –

+0

, скажем, мне нужен точный массив из 10 элементов, и после разворачивания мне нужно знать, где значение и где nil встречается – DCDC

-1

Вы можете сделать это следующим образом ,

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

При печати массива с помощью печати(), вы увидите его, как это,

[optional(1),optional(2)...] 

Это правильно, потому что выход, ваш массив предполагается провести дополнительный Int, который будет представлен как

опционально (1)

для целого необязательное значение 1.

Если вы хотите перебрать optionalIntArray и добавить только распакованное значение, используйте flatMap() на массиве, как,

let arrayContainingUnwrappedValues = optionalIntArray.flatMap{$0} 
arrayContainingUnwrappedValues 
1

Как вы сказали в комментариях, вы хотите, чтобы напечатать массив в этом роде формат:

[1, 2, 3, nil, 5, nil, 7] 

вместо этого:

[Optional(1), Optional(2), Optional(3), nil, Optional(5), nil, Optional(7)] 

Вы можете использовать цикл, который проверяет, является ли ноль каждый элемент. Если он равен нулю, напечатайте «nil», иначе, разверните и напечатайте номер.

Но это будет слишком много кода для написания, не так ли? Вам придется обрабатывать размещение запятых и []. Поэтому я придумал этот маленький трюк ...Вы не могли бы это, хотя:

final class Nil: CustomStringConvertible { 
    var description: String = "nil" 
} 

let a: [Int?] = [1, 2, 3, nil, 5, nil, 7] // this is your original array 
let b: [AnyObject] = a.map { $0 as AnyObject? ?? Nil() } 
print(b) 

Я признаю, что это не чистый, но я имею в виду, это меньше кода в конце концов.

0

Вы ответили на свой вопрос, но не знаете, почему вы уже правы.

Вы используете массив опций, потому что, как вы сказали, даже вы не знаете, есть ли что-то Int или Необязательно. Прокрутите массив и попробуйте развернуть с помощью let, а затем сделайте все, что вам нужно. Имея [Необязательный (1), Необязательный (2) ...] правильный, потому что [1,nil,2,nil,3] на самом деле является массивом необязательных Ints (Int?), И массив должен иметь объявление определенного типа.

Смежные вопросы