你可以使用运行时自检Mirror
:
let foo: String? = "foo"
let bar: String = "bar"
var a: Any = foo
// if wrapping an optional, the reflection of the value has
// a displaystyle "optional"
if let displayStyle = Mirror.init(reflecting: a).displayStyle {
print(displayStyle) // optional
}
// for a non-optional fundamental native type: no displaystyle
a = bar
if let displayStyle = Mirror.init(reflecting: a).displayStyle {
print(displayStyle)
} // prints nothing
可选/可选示例,其中,基础类型是用户定义的(非天然的):
struct Foo {}
let foo: Foo? = Foo()
let bar: Foo = Foo()
var a: Any = foo
// if wrapping an optional, the reflection of the value has
// a displaystyle "optional"
if let displayStyle = Mirror(reflecting: a).displayStyle {
print(displayStyle) // optional
}
// for a non-optional non-fundamental type:
a = bar
if let displayStyle = Mirror(reflecting: a).displayStyle {
print(displayStyle) // struct
}
如果不想需要使用绑定displayStyle
变量(例如打印),而只是想检查包裹的值是否是任何形式的可选项,你可以添加一个布尔条款,规定持有displayStyle
案件可选结合if
声明,
if let displayStyle = Mirror(reflecting: a).displayStyle,
displayStyle == .optional {
// is an optional ...
}
...或删除使用零合并运算符,取而代之的是单个条件表达式完全结合(??
)
if Mirror(reflecting: a).displayStyle ?? .class == .optional {
// is an optional
}
注意然而,对于上述所有的方法中,这简单地告诉您如dev的由Any
实例包裹类型是可选的还是不是:Swifts输入系统stil我对此一无所知。
只是好奇,为什么你想在运行时检查一个变量是可选的?通常,当您查看代码时,您已经知道该期待什么。我不是说你做错了什么,只是想知道。 –
在你的代码中,'a'是_typed_ as Any。因此它可以不是'可选'。 –
matt
@matt我认为op是想知道由非可选的'Any'实例_包装的值是否可选(不是我有什么想法,这将是有用的)。 – dfri