Добавление необязательного значения к [Any] привело к предупреждению компилятора — выражение неявно вытеснено из Double? любому

В настоящее время я изучаю тип «Любой» в Swift и придумал следующий код

let optionalDouble: Double? = 45.1
let things: [Any] = [
    0,
    0.0,
    1.1,
    optionalDouble, //expression implicitly coerced from Double? to Any 
    -4.0,
    ("hello", 1),
    Movie(name: "Titanic", director: "James"),
    {(name: String) -> String in
        return "hello \(name)"
    },
    {},
    ["one": 1, "two": 2]
]

Однако, когда я попытался добавить необязательное значение Double в массив [Any], быстрый компилятор отобразил предупреждение о том, что

//expression implicitly coerced from Double? to Any

Я думал, что тип Any может представлять все, а массив типа [Any] может содержать все. Так почему предупреждающее сообщение?


person Thor    schedule 31.01.2017    source источник


Ответы (1)


Это только предупреждение. Компилятор хочет убедиться, что вы понимаете, что делаете что-то странное, заключая необязательный элемент в любой.

В строке, вызывающей проблемы, напишите optionalDouble as Any, чтобы скрыть предупреждение.

person matt    schedule 31.01.2017
comment
большое спасибо за объяснение. Я не уверен, что это считается дополнительным вопросом или заслуживает отдельного поста, но что я должен написать, когда я хочу проверить оператор switch, чтобы узнать, является ли объект внутри [Any] необязательным Double тип? - person Thor; 31.01.2017
comment
Это очень трудно. Именно поэтому они предостерегают вас от этого! - person matt; 31.01.2017
comment
Чтобы быть немного более экспансивным: вы можете легко узнать, что это в конечном счете Двойник, с case is Double. Но узнать, что это Double, обернутый в Optional — хммм. Вам не разрешено говорить case is Optional<Double>, потому что это более необязательный тип. Вы видите проблему. - person matt; 31.01.2017
comment
да, это именно та ошибка, которую показал мне быстрый компилятор, я думаю, мне следует просто избегать использования типа Any, если только это не абсолютно необходимо или пока я не смогу полностью понять это. - person Thor; 31.01.2017