确定Any.Type是否为可选

idm*_*ean 13 dynamic swift

我正在尝试确定给定的type t(Any.Type)是否是可选类型,我正在使用此测试

t is Optional<Any>.Type
Run Code Online (Sandbox Code Playgroud)

但它总是返回false.

有没有办法实现这个目标?

Lop*_*Sae 16

假设你要做的是这样的:

let anyType: Any.Type = Optional<String>.self
anyType is Optional<Any>.Type // false
Run Code Online (Sandbox Code Playgroud)

目前可悲的是(从Swift 2开始)不支持协方差,也不支持逆向和直接类型检查Optional.Type无法完成:

// Argument for generic parameter 'Wrapped' could not be inferred
anyType is Optional.Type // Causes error
Run Code Online (Sandbox Code Playgroud)

另一种方法是Optional扩展特定协议,并检查该类型:

protocol OptionalProtocol {}

extension Optional : OptionalProtocol {}

let anyType: Any.Type = Optional<String>.self
anyType is OptionalProtocol.Type // true
Run Code Online (Sandbox Code Playgroud)

  • `OptionalProtocol` 可以有一些很好的用途:它可以用来提供 [a *generic-less* 接口来访问 Optional 值](http://stackoverflow.com/questions/27989094/how-to-unwrap-an -optional-value-from-any-type/32780793#32780793) 和 [甚至包装类型](http://stackoverflow.com/questions/32645612/check-if-variable-is-an-optional-and-what -type-it-wraps/32781143#32781143)。 (2认同)

Kaz*_*awa 5

派对有点晚了.但是,我遇到了同样的问题.这是我的代码.

func isOptional(_ instance: Any) -> Bool {
    let mirror = Mirror(reflecting: instance)
    let style = mirror.displayStyle
    return style == .optional
}

let a: Int = 1 // false
let b: Int? = 2 // true
let c: Double = 3.0 // false
let d: Double? = 4.0 // true
let e: NSString = "Hello" // false
let f: NSString? = "Hello" // true


isOptional(a) // fasle
isOptional(b) // true - warning
isOptional(c) // false
isOptional(d) // true - warning
isOptional(e) // false
isOptional(f) // true - warning
Run Code Online (Sandbox Code Playgroud)

它对我来说很好看. swift4