是否可以检查变量是否是可选的,以及它包装的是什么类型?
可以检查变量是否为特定的可选变量:
let someString: String? = "oneString"
var anyThing: Any = someString
anyThing.dynamicType // Swift.Optional<Swift.String>
anyThing.dynamicType is Optional<String>.Type // true
anyThing.dynamicType is Optional<UIView>.Type // false但是有没有可能检查任何类型的可选?类似于:
anyThing.dynamicType is Optional.Type // fails since T cant be inferred
// or
anyThing.dynamicType is Optional<Any>.Type // false一旦知道你有一个可选的,检索它包装的类型:
// hypothetical code
anyThing.optionalType // returns String.Type发布于 2015-09-25 19:27:38
因为a protocol can be created as means of a Optional,所以可以使用相同的协议来提供对optional类型的访问。示例在Swift 2中,尽管它在以前的版本中应该具有类似的工作方式:
protocol OptionalProtocol {
func wrappedType() -> Any.Type
}
extension Optional : OptionalProtocol {
func wrappedType() -> Any.Type {
return Wrapped.self
}
}
let maybeInt: Any = Optional<Int>.Some(12)
let maybeString: Any = Optional<String>.Some("maybe")
if let optional = maybeInt as? OptionalProtocol {
print(optional.wrappedType()) // Int
optional.wrappedType() is Int.Type // true
}
if let optional = maybeString as? OptionalProtocol {
print(optional.wrappedType()) // String
optional.wrappedType() is String.Type // true
}发布于 2015-09-18 19:12:01
使用Swift2.0:
let someString: String? = "oneString"
var anyThing: Any = someString
// is `Optional`
Mirror(reflecting: anyThing).displayStyle == .Optional // -> true但是提取包装类型并非易事。
您可以:
anyThing.dynamicType // -> Optional<String>.Type (as Any.Type)
Mirror(reflecting: anyThing).subjectType // -> Optional<String>.Type (as Any.Type)但是我不知道如何从用Any.Type包装的Optional<String>.Type中提取String.Type
https://stackoverflow.com/questions/32645612
复制相似问题