你可以使用運行時自檢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