问题标签 [keypaths]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
640 浏览

swift - 可选值上的 KeyPath 出现奇怪错误

考虑以下代码片段

这完美地工作并且Optional(10)按预期打印。在我的实际应用程序中,我试图以这种方式设置的字段被声明为Date?,它会导致一些奇怪的错误。我的实际应用程序的 MWE 是这样的:

但是编译器抱怨突出显示的行并说:

可选类型“日期?”的值 必须解包为“日期”类型的值

修复:使用 '??' 合并 当可选值包含“nil”时提供默认值

修复:使用“!”强制展开 如果可选值包含“nil”,则中止执行

这是我们可以期望在最终版本之前修复的编译器错误,还是我对键路径不了解?

我正在使用 Xcode 11 beta 3,但我在 beta 2 中也遇到了同样的问题。如果它有用,实际代码在这里

0 投票
0 回答
52 浏览

swift - 通用 NSKeyValueObservedChange/Keypath

我有一个数组NSKeyValueObservation。我正在查看 a 上的一些属性,NSManagedObject并且我想在属性更改时执行所有相同的方法。这是代码:

我正在尝试像这样应用它:

但比我得到的错误:

在没有更多上下文的情况下,表达式的类型是模棱两可的

我不关心 KeyPath,我只想刷新另一个视图。这些属性都是不同的类型。

0 投票
0 回答
65 浏览

nsdictionary - 陷阱 valueForKeyPath 的麻烦:没有有效的路径

我有一个嵌套NSMutableDictionary,并且成功地提取了嵌套在其他字典中的某个“深度”的值,例如:

NSNumber *num = [myDictionary valueForKeyPath:@"league.team.away.score"];

一切都很好。而且我可以确认所有级别的所有字典都是可变的。

但是......如果那个关键路径不存在怎么办?

正如所料,我得到一个NSUndefinedKeyException. 我尝试使用 try/catch 策略进行修复,但无济于事。

苹果对此问题的解决方案压倒一切valueForUndefinedKey

“子类可以覆盖此方法以返回未定义键的替代值。默认实现引发 NSUndefinedKeyException。”

太好了...所以我创建了一个子类NSMutableDictionaryMod,然后我收到了投诉... [NSMutableDictionary initWithCapacity:]仅为抽象类定义的方法。定义-[NSMutableDictionaryMod initWithCapacity:]!

我去定义所说的初始化程序(并且可以确认它在Xcode中到达那里),但是它在线上崩溃了self = [super initWithCapacity:numItems];

然后我注意到这个苹果宝石NSMutableDictionary

通常应该很少需要继承 NSMutableDictionary。如果您确实需要自定义行为,通常最好考虑组合而不是子类化。

任何建议,将不胜感激。

0 投票
0 回答
567 浏览

swift - 协议可以在采用对象中没有明确实现的情况下定义下标(keyPath:) 吗?

自 Swift 4 以来,已经获得了subscript(keyPath:)可用于检索值的对象AnyKeyPath及其子类。根据Swift 书,下标is available on all types。例如,一个类的实例TestClass可以用AnyKeyPath类似这样的下标:

这可以按预期正确编译。使用任何其他有效的子类也可以编译,包括PartialKeyPath<TestClass>,KeyPath<TestClass, Bool>等。此功能在协议扩展中不可用。例如,以下内容无效:

如果我们想在协议中使用那个 keyPath 下标,我们可以将它包含在协议定义中。但是,编译器不会自动解析它:

有了这个,我们得到一个编译错误:Type 'TestObject' does not conform to protocol 'KeyPathSubscriptable'. 为了解决这个问题,我们必须在 中包含该下标的冗余实现TestClass

这解决了一致性问题并产生了目标结果,尽管它看似不必要且不合逻辑。我不确定如何,但下标实现甚至从未使用过。它正在寻找并使用它的预期实现subscript(keyPath:),但是如何呢?那在哪里,有没有办法在协议中使用它?为什么编译器需要它,即使它从未使用过?

此用例的上下文位于日志记录模块中。目标是对象应该能够采用特定的协议,该协议无需对对象进行额外设置,就可以提供对象的人类可读性description,而不是许多对象的默认值,即内存地址。该协议将使用 Mirror 来获取KeyPath对象的 s、读取值并将它们打印到控制台。它用于调试目的,不会在任何生产环境中运行。

如果我能做出任何澄清,请告诉我。如果其他人认为这可能是某种错误,我可能会将其发布给 Swift 团队。感谢所有帮助。提前致谢。

完整的要点位于此处

0 投票
1 回答
535 浏览

arrays - Swift Keypath:如何将它们连接在一起并引用数组?

我想更好地理解 SWIFT Keypaths,尤其是:

  1. 创建包括多个级别的键路径
  2. 创建下标为数组的键路径
  3. 将键路径连接在一起
  4. 了解键路径的类型
0 投票
0 回答
40 浏览

javascript - 为什么将 JSONObject 放入 indexedDB 数据库时会出错?

我目前正在尝试运行 indexedDB 数据库。但是,我正在努力解决有关 indexedDB 的 put 方法的一些问题。虽然定义了keypath,并且移交的JSONObject包含一个与定义的keypath命名方式相同的值,但put方法会导致以下错误:

未捕获的 DOMException:无法在“IDBObjectStore”上执行“放置”:评估对象存储的键路径未产生值。

为了确保 JSONObject 确实包含应用作键的值,我正在记录该对象。这就是它的样子:

{"key":102019,"month":10,"year":2019,"spendings":[{"type":{"name":"Technology","importance":70,"iconURL":". /Resources/Technology.png"},"cost":"1500","name":"Macbook pro","timestamp":1571696285911}],"budget":0}

用于存储数据的代码如下:

0 投票
2 回答
295 浏览

python - Swift 的 @dynamicMemberLookup 是否有 Python 等价物?

Swift中,您可以定义@dynamicMemberLookup参见文档)以直接访问嵌套在另一种类型中的属性。有没有Python等价物?

我想要实现的示例Python

假设我有一个有成员的班级,例如:

我希望能够获取/设置这些成员,而不必inner_class每次都输入:

Swift来源)中的示例:

按成员名称动态查找成员

按关键路径动态查找成员

我唯一的想法是Pythonmonkey-patch所有嵌套属性直接传递给外部类。

0 投票
0 回答
57 浏览

swift - Swift Generic Functions、Protocols 和 associatedType - 无法使用类型为“(来自:T)”的参数列表调用函数

我正在尝试为执行相同操作的不同类型对象概括一个函数(使用 keyPath 从对象中检索一个值)。

我在协议中使用了 associatedType,因为每个对象都有自己不同的字典。

函数 fillOutputs(container: inout T) 从对象中检索由键路径指定的参数的值并将其附加到数组中。

我在代码末尾的 container.outputs.append 行中收到错误,如下所示:无法使用类型为“(来自:T)”的参数列表调用“检索”。这是指检索(来自:容器)。在尝试概括之前,此函数是每个对象(容器)的方法,并且使用retrieve(from: self) 有效。

作为参考,retrieve 方法是另一个通用函数的一部分:

鉴于我不是 Swift 专家,也不是完全理解协议,我可能迷失在一杯水中,我将不胜感激任何想法/帮助。谢谢

0 投票
1 回答
90 浏览

swift - 如何在 KeyPath 中使用“Self.attr”?

我正在尝试在协议扩展中使用“Self.displayOrder”,但它会引发以下错误“线程 1:致命错误:无法从 KeyPath Swift.ReferenceWritableKeyPath 中提取字符串”

这是代码

0 投票
1 回答
36 浏览

swift - 使用协议定义具有不同值的 KeyPath 集合

假设您想要跟踪一个或多个唯一标识符。在这种情况下,A有两个属性被认为是唯一的A,而B只有一个属性是唯一的B

如果只有一个唯一键,我们可以这样做:

...但这将我限制在一把钥匙上。