【发布时间】:2015-03-15 08:39:47
【问题描述】:
给定一个包含可选值和非可选值的[Any] 数组,例如:
let int:Int? = 1
let str:String? = "foo"
let values:[Any] = [int,2,str,"bar"]
我们如何提取Any 类型(如果有)中的Optional 的值,以便我们可以创建一个只打印出值的通用打印函数。
例如这个 printArray 函数遍历并打印每个元素:
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
我们怎样才能改变它,让它只打印底层值,如果它是可选的,它就会解开这个值?例如:
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
【问题讨论】:
-
真的只是问题的一个特例,你不能问某事是否是可选的......
-
@matt 是的并提取它的价值,只是想表达问题,以便答案会显示这一点,而不是静态可选展开的示例。
-
是的,为措辞精美的谜题投票。当然,你不会得到任何答案。 :)
-
添加!在值[i]之后
-
到目前为止我已经发布了代码。也许有人会渡过最后一道障碍。
标签: swift