我想,以确定是否给定类型t
(Any.Type
)是一个可选的类型,我使用的这个测试确定是否Any.Type是可选
t is Optional<Any>.Type
,但它总是返回假。
那么有什么办法可以做到这一点?
我想,以确定是否给定类型t
(Any.Type
)是一个可选的类型,我使用的这个测试确定是否Any.Type是可选
t is Optional<Any>.Type
,但它总是返回假。
那么有什么办法可以做到这一点?
假设你正在尝试做的是这样的:
let anyType: Any.Type = Optional<String>.self
anyType is Optional<Any>.Type // false
可悲迅速当前(如夫特2)不支持covariance nor contravariance和类型检查直接抵靠Optional.Type
无法做到:
// Argument for generic parameter 'Wrapped' could not be inferred
anyType is Optional.Type // Causes error
另一种方法是使Optional
延伸一个特定的协议,并检查该类型:迟到的一方
protocol OptionalProtocol {}
extension Optional : OptionalProtocol {}
let anyType: Any.Type = Optional<String>.self
anyType is OptionalProtocol.Type // true
你可以使用泛型来实现这一目标:
func isOptional<T>(x:T?)->Bool
{
return true
}
func isOptional<T>(x:T)->Bool
{
return false
}
编辑
上面的代码可以用来知道,如果一个变量是可选的类型。 我已想出知道含有一个类型的变量的唯一方法是通过使用反射:
var t1:Any.Type=(String?).self
var t2:Any.Type=(String).self
Mirror(reflecting: t1).description
Mirror(reflecting: t2).description
到镜子的第一个呼叫给串"Mirror for Optional<String>.Type"
,并且第二给"Mirror for String.Type"
。
据我所知,比较字符串不是做此项检查的便利方式,我会再次尝试找到更好的性能..
't'永远不是可选的,它总是一个类型对象(可能代表可选),所以总是调用第二个方法。 – idmean
好的,对不起,我试图找到可行的东西 – hariseldon78
的位。但是,我遇到了同样的问题。这是我的代码。
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
这对我来说很好。 swift4
'OptionalProtocol'可以有一些不错的用途:它可以用来提供[一个*通用less *接口来访问可选值](http:// stackoverflow如何解开一个可选的值从任何类型/ 32780793#32780793)[甚至包装类型](http://stackoverflow.com/questions/32645612/check -if-可变是-AN-可选和 - 什么型-IT-包装/ 32781143#32781143)。 – LopSae