【问题标题】:Accessing the optional value of a PartialKeyPath in Swift 4在 Swift 4 中访问 PartialKeyPath 的可选值
【发布时间】:2018-07-01 19:56:35
【问题描述】:

使用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 以提取可选内容?

【问题讨论】:

标签: swift optional keypaths


【解决方案1】:

解决方案是使用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 */

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-30
    • 1970-01-01
    相关资源
    最近更新 更多