swift – 如何解开任意类型的可选值?

前端之家收集整理的这篇文章主要介绍了swift – 如何解开任意类型的可选值?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
给定一个[Any]的数组,其中包含可选值和非可选值,例如:
  1. let int:Int? = 1
  2. let str:String? = "foo"
  3.  
  4. let values:[Any] = [int,2,str,"bar"]

我们如何提取在Any类型(如果有)的Optional的值,所以我们可以创建一个通用打印函数,只打印出值。

例如。这个printArray函数遍历并打印每个元素:

  1. func printArray(values:[Any]) {
  2. for i in 0..<values.count {
  3. println("value[\(i)] = \(values[i])")
  4. }
  5. }
  6.  
  7. printArray(values)

其中将输出

  1. value[0] = Optional(1)
  2. value[1] = 2
  3. value[2] = Optional("foo")
  4. value[3] = bar

我们如何更改它,以便它只打印底层值,以便它解包的值,如果它是可选的?例如:

  1. value[0] = 1
  2. value[1] = 2
  3. value[2] = foo
  4. value[3] = bar

更新进度…

将参数更改为[Any?]时可以工作,例如:

  1. let values:[Any?] = [int,"bar"]
  2.  
  3. func printArray(values:[Any?]) {
  4. for i in 0..<values.count {
  5. println("value[\(i)] = \(values[i]!)")
  6. }
  7. }
  8.  
  9. printArray(values)

其中将打印所需的:

  1. value[0] = 1
  2. value[1] = 2
  3. value[2] = foo
  4. value[3] = bar

但仍然想看看我们如何解开一个Optional从Any,因为这是什么MirrorType.value返回使得很难提取可选值,例如:

  1. class Person {
  2. var id:Int = 1
  3. var name:String?
  4. }
  5.  
  6. var person = Person()
  7. person.name = "foo"
  8.  
  9. var mt:MirrorType = reflect(person)
  10. for i in 0 ..< mt.count {
  11. let (name,pt) = mt[i]
  12. println("\(name) = \(pt.value)")
  13. }

打印:

  1. id = 1
  2. name = Optional("foo")

当我需要:

  1. id = 1
  2. name = foo
对于Xcode 7和Swift 2:
  1. func unwrap(any:Any) -> Any {
  2.  
  3. let mi = Mirror(reflecting: any)
  4. if mi.displayStyle != .Optional {
  5. return any
  6. }
  7.  
  8. if mi.children.count == 0 { return NSNull() }
  9. let (_,some) = mi.children.first!
  10. return some
  11.  
  12. }
  13.  
  14.  
  15. let int:Int? = 1
  16. let str:String? = "foo"
  17. let null:Any? = nil
  18. let values:[Any] = [unwrap(int),unwrap(str),"bar",unwrap(null)]

这将给你[1,2,“foo”,“bar”,{NSObject}]

将NSNull()更改为nil,并将unwrap func的返回值更改为Any?将总是解包任何类型。

猜你在找的Swift相关文章