如何从Swift中的可选类型获取展开类型?
我正在尝试在运行时从可选类型获取未包装类型。 下面的代码将a的类型打印为如何从Swift中的可选类型获取展开类型?,swift,swift2,Swift,Swift2,我正在尝试在运行时从可选类型获取未包装类型。 下面的代码将a的类型打印为可选的 现在我想打开类型并获取字符串,我应该如何在运行时实现这一点 您可以使用砰的一声(!)或使用(如果让)来显式打开可选的 例如: var foo: String? = nil if foo == nil { print("foo is nil") foo = "bar" } let fooBang = foo! print("fooBang: \(fooBang)") if let ifLetFoo
可选的
现在我想打开类型并获取字符串
,我应该如何在运行时实现这一点 您可以使用砰的一声(!
)或使用(如果让
)来显式打开可选的
例如:
var foo: String? = nil
if foo == nil {
print("foo is nil")
foo = "bar"
}
let fooBang = foo!
print("fooBang: \(fooBang)")
if let ifLetFoo = foo {
print("ifLetFoo: \(ifLetFoo)")
}
这将打印:
foo is nil
fooBang: bar
ifLetFoo: bar
在您的上下文中,我认为print(child.value.dynamicType!)
可能就是您要查找的内容。如果您将值强制转换为非可选字符串,它将打印未包装的类型
let mirror = Mirror(reflecting: a)
for child in mirror.children {
print(String(child.value).dynamicType) //String
}
或者,您可以使用字符串并从可选类型中获取类型
class MySubClass: MyClass {
var a: Int? = nil
}
var a = MySubClass()
let mirror = Mirror(reflecting: a)
for child in mirror.children {
let typeArr = String(child.value.dynamicType).characters.split{$0 == "<"}.map(String.init)
let typeArr2 = typeArr[1].characters.split{$0 == ">"}.map(String.init)
print(typeArr2[0]) // print: Int
}
class MySubClass:MyClass{
变量a:Int?=nil
}
var a=MySubClass()
让镜子=镜子(反射:a)
给镜子里的孩子{
让typeArr=String(child.value.dynamicType).characters.split{$0==“”}.map(String.init)
打印(typeArr2[0])//打印:Int
}
很抱歉,这很蹩脚,但您可以这样做。我对您的想法有点玩味,但我认为没有真正的方法可以做到这一点,因为您还无法获得枚举的关联值的类型。因此,选项基本上是枚举,我们这里有一个问题
我的想法是测试模型对象中所有可能的值类型。比如:
let myModelObject:Any? = someWayToGetTheData()
if let aString = myModelObject as? String {
// do everything you need to store a string
}
else if let anInteger = myModelObject as? Int {
// do everything you need to store an integer
}
// and so on ...
由于您的json和模型必须具有预定义数量的受支持转换,这是一种可行的方法,而且据我所知,您的原始问题基本上与测试可选枚举的动态关联值类型一样有用,这也将导致一系列if-else语句。假设您有一个可选的
let someVar: String?
然后print(type(of:someVar))
将打印
Optional<String>
String
String
然后打印(someVar.wrappedType())
将打印
Optional<String>
String
String
没有任何思考
摘要
只要选项未被Any
或AnyObject
引用,代码就可以正常工作
对于Any
您必须首先将其转换为OptionalProtocol
。运行
let someVar: String?
let anyVar = someVar as Any
if let op = anyVar as? OptionalProtocol {
print(op.wrappedType())
}
将打印
Optional<String>
String
String
至于AnyObject
,奇怪的是(至少对我来说),它没有强制转换为OptionalProtocol
原始的StackOverflow答案可以找到到底是为了什么?这只是你不喜欢的日志还是你有一个真正的问题?在我的真实案例中,它是这样的:var a:Model?=零,我仍然想要未包装的类型为什么你想要未包装的类型你想用它吗?或者您想将其写入控制台或其他地方?@GyorgyTrum我想将json传输到模型对象中,所以我需要知道模型对象中每个属性的未包装类型。@ZhuShengqi:我仍然不明白其目的。您有一个JSON,但在编译时您不知道哪个模型类应该包含该数据?因此,您正在调用web服务,但不知道它将返回什么数据?我不需要该值。我想要展开的对象类型,即使目标为零。但无论如何还是要感谢:)我需要的是类型而不是类型的名称:(是的,你是对的。我只是发现Swift 2.1的反射API完全是个狗屎。我必须使模型对象的每个属性都非可选,我认为这真是一个丑陋的设计(可选是检查是否有值的好工具).希望Swift 3.0能改变这一切。@朱圣琪:如果我的答案对你有帮助,如果你能把它标记为正确答案,那就太好了。谢谢。