gpt4 book ai didi

swift - 如何从 Any 类型中解包一个可选值?

转载 作者:IT王子 更新时间:2023-10-29 04:59:42 24 4
gpt4 key购买 nike

给定一个包含可选值和非可选值的 [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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com