我正在尝试从运行时的可选类型中获取未包装的类型。以下代码将显示a的类型Optional
。
class MySubClass: MyClass { var a: String? = nil } var a = MySubClass() let mirror = Mirror(reflecting: a) for child in mirror.children { print(child.value.dynamicType) }
现在,我想解开类型并获取String
,我应该怎么做才能在运行时做到这一点?
假设您有一个可选的
let someVar: String?
然后print(type(of: someVar))
将打印
Optional
但是如果您将以下扩展名添加到 Optional
protocol OptionalProtocol { func wrappedType() -> Any.Type } extension Optional: OptionalProtocol { func wrappedType() -> Any.Type { return Wrapped.self } }
然后print(someVar.wrappedType())
将打印
String
没有任何反射
TL; DR
只要未引用该函数,Any
否则AnyObject
该代码即可正常工作。
因为Any
您必须将其强制转换为OptionalProtocol
第一。跑步
let someVar: String? let anyVar = someVar as Any if let op = anyVar as? OptionalProtocol { print(op.wrappedType()) }
将打印
String
至于AnyObject
(至少对我来说)奇怪的是,它并没有转换为OptionalProtocol
。
原始StackOverflow答案可在此处找到