作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
给定一个包含可选值和非可选值的 [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
我们如何更改它以便它只打印基础值,以便在它是 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
最佳答案
对于 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),2,unwrap(str),"bar", unwrap(null)]
这会给你 [1, 2, "foo", "bar", {NSObject}]
将 NSNull()
更改为 nil
并将 unwrap func 的返回值更改为 Any?
将始终解包任何类型。
关于swift - 如何从 Any 类型中解包一个可选值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27989094/
我正在尝试用 Swift 编写这段 JavaScript 代码:k_combinations 到目前为止,我在 Swift 中有这个: import Foundation import Cocoa e
我是一名优秀的程序员,十分优秀!