Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从Swift中的可选类型获取展开类型?_Swift_Swift2 - Fatal编程技术网

如何从Swift中的可选类型获取展开类型?

如何从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

我正在尝试在运行时从可选类型获取未包装类型。 下面的代码将a的类型打印为
可选的


现在我想打开类型并获取
字符串
,我应该如何在运行时实现这一点

您可以使用砰的一声(
)或使用
(如果让
)来显式打开可选的

例如:

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能改变这一切。@朱圣琪:如果我的答案对你有帮助,如果你能把它标记为正确答案,那就太好了。谢谢。