Сравнивать тип литерала в swift не удается?

Этот код работает на Swift 3:

let a = 1
type(of: a) == Int.self // true

Однако замечательно, что этот код не работает:

// error: binary operator '==' cannot be applied to two 'Int.Type' operands
type(of: 1) == Int.self

Каков синтаксис для работы второго сравнения, если таковой имеется?

Большое спасибо.

7 голосов | спросил agro1986 22 MaramWed, 22 Mar 2017 10:04:01 +03002017-03-22T10:04:01+03:0010 2017, 10:04:01

1 ответ


0

Я думаю, что сообщение об ошибке вводило в заблуждение. Реальная проблема заключалась в том, как интерпретировать литерал 1 во втором вызове. Swift по умолчанию равен Int, когда вы определяете переменную:

let a = 1 // a is an Int

Но компилятор может прочитать его как Double, UInt32, CChar и т. д. в зависимости от контекста:

func takeADouble(value: Double) { ... }
func takeAUInt(value: UInt) { ... }

takeADouble(value: 1) // now it's a Double
takeAUInt(value: 1)   // now it's a UInt

type(of:) является определен как универсальная функция:

func type<Type, Metatype>(of: Type) -> Metatype

Компилятор не знает, как интерпретировать универсальный параметр Type: это должен быть Int, UInt, UInt16 и т. д.? Вот ошибка, которую я получил из песочницы IBM Swift:

Overloads for '==' exist with these partially matching parameter lists
(Any.Type?, Any.Type?), (UInt8, UInt8), (Int8, Int8),
(UInt16, UInt16), (Int16, Int16), (UInt32, UInt32), ...

Вы можете помочь компилятору, сообщив ему, какой он тип:

type(of: 1 as Int) == Int.self
ответил Code Different 22 MarpmWed, 22 Mar 2017 17:05:03 +03002017-03-22T17:05:03+03:0005 2017, 17:05:03

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132