假设有一个混合了可选和非可选值的 [Any]
类型的数组,例如:
let int:Int? = 1
let str:String? = "foo"
let values:[Any] = [int,2,str,"bar"]
我们如何提取Any
类型中Optional
的值(如果有),以便我们可以创建一个通用的打印函数,只打印出这些值。例如,此打印数组函数逐个打印每个元素:func printArray(values:[Any]) {
for i in 0..<values.count {
println("value[\(i)] = \(values[i])")
}
}
printArray(values)
输出结果将是:
value[0] = Optional(1)
value[1] = 2
value[2] = Optional("foo")
value[3] = bar
我们怎样才能改变它,使它只打印基础值,以便在其为Optional的情况下解包该值?例如:value[0] = 1
value[1] = 2
value[2] = foo
value[3] = bar
更新进度...
当将参数更改为[Any?]
时,它可以正常工作,例如:
let values:[Any?] = [int,2,str,"bar"]
func printArray(values:[Any?]) {
for i in 0..<values.count {
println("value[\(i)] = \(values[i]!)")
}
}
printArray(values)
哪个将打印所需内容:
value[0] = 1
value[1] = 2
value[2] = foo
value[3] = bar
但仍然想看看如何从 Any
中展开 Optional,因为这是 MirrorType.value
返回的内容,使得提取 Optional 值变得困难,例如:
class Person {
var id:Int = 1
var name:String?
}
var person = Person()
person.name = "foo"
var mt:MirrorType = reflect(person)
for i in 0 ..< mt.count {
let (name, pt) = mt[i]
println("\(name) = \(pt.value)")
}
输出:
id = 1
name = Optional("foo")
当我需要:
id = 1
name = foo