gpt4 book ai didi

swift - 从 Swift 4 中的结构获取所有关键路径

转载 作者:IT王子 更新时间:2023-10-29 05:37:25 25 4
gpt4 key购买 nike

假设我有那个结构:

struct MyStruct {
let x: Bool
let y: Bool
}

在 Swift 4 中,我们现在可以使用 myStruct[keyPath:\MyStruct.x] 接口(interface)访问它的属性。

我需要的是一种访问所有关键路径的方法,例如:

extension MyStruct {

static func getAllKeyPaths() -> [WritableKeyPath<MyStruct, Bool>] {
return [
\MyStruct.x,
\MyStruct.y
]
}

}

但是,显然,我不必手动声明数组中的每个属性。

我怎样才能做到这一点?

最佳答案

免责声明:

请注意,以下代码仅用于教育目的,不应在实际应用中使用,并且可能包含很多错误/奇怪的行为,如果KeyPath 就是这样使用的。

回答:

我不知道你的问题今天是否仍然相关,但挑战很有趣 :)

这实际上可以使用镜像 API。

KeyPath API 目前不允许我们从字符串初始化一个新的 KeyPath,但它支持字典“解析”。

这里的想法是使用镜像 API 构建一个描述 struct 的字典,然后遍历 key 以构建 KeyPath 数组。

Swift 4.2 Playground :

protocol KeyPathListable {
// require empty init as the implementation use the mirroring API, which require
// to be used on an instance. So we need to be able to create a new instance of the
// type.
init()

var _keyPathReadableFormat: [String: Any] { get }
static var allKeyPaths: [KeyPath<Foo, Any?>] { get }
}

extension KeyPathListable {
var _keyPathReadableFormat: [String: Any] {
let mirror = Mirror(reflecting: self)
var description: [String: Any] = [:]
for case let (label?, value) in mirror.children {
description[label] = value
}
return description
}

static var allKeyPaths: [KeyPath<Self, Any?>] {
var keyPaths: [KeyPath<Self, Any?>] = []
let instance = Self()
for (key, _) in instance._keyPathReadableFormat {
keyPaths.append(\Self._keyPathReadableFormat[key])
}
return keyPaths
}
}

struct Foo: KeyPathListable {
var x: Int
var y: Int
}

extension Foo {
// Custom init inside an extension to keep auto generated `init(x:, y:)`
init() {
x = 0
y = 0
}
}

let xKey = Foo.allKeyPaths[0]
let yKey = Foo.allKeyPaths[1]

var foo = Foo(x: 10, y: 20)
let x = foo[keyPath: xKey]!
let y = foo[keyPath: yKey]!

print(x)
print(y)

请注意,打印输出并不总是顺序相同(可能是因为镜像 API,但不太确定)。

关于swift - 从 Swift 4 中的结构获取所有关键路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46508705/

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