给定一个[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,"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
但仍然想看看我们如何解开一个Optional从Any,因为这是什么MirrorType.value返回使得很难提取可选值,例如:
- 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
对于Xcode 7和Swift 2:
- func unwrap(any:Any) -> Any {
- let mi = Mirror(reflecting: any)
- if mi.displayStyle != .Optional {
- return any
- }
- if mi.children.count == 0 { return NSNull() }
- let (_,some) = mi.children.first!
- return some
- }
- let int:Int? = 1
- let str:String? = "foo"
- let null:Any? = nil
- let values:[Any] = [unwrap(int),unwrap(str),"bar",unwrap(null)]
这将给你[1,2,“foo”,“bar”,{NSObject}]
将NSNull()更改为nil,并将unwrap func的返回值更改为Any?将总是解包任何类型。