gpt4 book ai didi

swift - 在 Swift 4 中访问 PartialKeyPath 的可选值

转载 作者:可可西里 更新时间:2023-11-01 01:08:40 37 4
gpt4 key购买 nike

使用 PartialKeyPath API,您如何访问键路径引用的值?例如,这适用于非可选值,但不适用于 Optional 值。

我遇到的问题是 self[keyPath: keyPath] 返回一个非可选的 Any 值。

struct Element {

let name: String
let mass: Double?

func stringValue(_ keyPath: PartialKeyPath<Element>) -> String {
let value = self[keyPath: keyPath]

switch value {
case let string as String:
return string.capitalized
case nil:
return "N/A"
case let value:
return String(describing: value)
}
}
}

let element = Element(name: "Helium", mass: 4.002602)
let string = element.stringValue(\Element.mass) /* Optional(4.002602) */

结果是 case nil 永远不会执行,最后一个 case 被打印为 Optional(value)

如何正确解包 value 以提取可选的?

最佳答案

解决方案是使用 Mirror 来解包可选的,这似乎不太理想。期待 Swift 中更好的反射支持!

func unwrap(_ value: Any) -> Any? {
let mirror = Mirror(reflecting: value)

if mirror.displayStyle != .optional {
return value
}

if let child = mirror.children.first {
return child.value
} else {
return nil
}
}

struct Element {

let name: String
let mass: Double?

func stringValue(_ keyPath: PartialKeyPath<AtomicElement>) -> String {
guard let value = unwrap(self[keyPath: keyPath]) else {
return "N/A"
}

switch value {
case let string as String:
return string.capitalized
default:
return String(describing: value)
}
}
}

let element = Element(name: "Helium", mass: 4.002602)
let string = element.stringValue(\Element.mass) /* 4.002602 */

关于swift - 在 Swift 4 中访问 PartialKeyPath 的可选值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51126588/

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