问题标签 [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.
swift - 可选值上的 KeyPath 出现奇怪错误
考虑以下代码片段
这完美地工作并且Optional(10)
按预期打印。在我的实际应用程序中,我试图以这种方式设置的字段被声明为Date?
,它会导致一些奇怪的错误。我的实际应用程序的 MWE 是这样的:
但是编译器抱怨突出显示的行并说:
可选类型“日期?”的值 必须解包为“日期”类型的值
修复:使用 '??' 合并 当可选值包含“nil”时提供默认值
修复:使用“!”强制展开 如果可选值包含“nil”,则中止执行
这是我们可以期望在最终版本之前修复的编译器错误,还是我对键路径不了解?
我正在使用 Xcode 11 beta 3,但我在 beta 2 中也遇到了同样的问题。如果它有用,实际代码在这里。
swift - 通用 NSKeyValueObservedChange/Keypath
我有一个数组NSKeyValueObservation
。我正在查看 a 上的一些属性,NSManagedObject
并且我想在属性更改时执行所有相同的方法。这是代码:
我正在尝试像这样应用它:
但比我得到的错误:
在没有更多上下文的情况下,表达式的类型是模棱两可的
我不关心 KeyPath,我只想刷新另一个视图。这些属性都是不同的类型。
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。如果您确实需要自定义行为,通常最好考虑组合而不是子类化。
任何建议,将不胜感激。
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 团队。感谢所有帮助。提前致谢。
完整的要点位于此处。
arrays - Swift Keypath:如何将它们连接在一起并引用数组?
我想更好地理解 SWIFT Keypaths,尤其是:
- 创建包括多个级别的键路径
- 创建下标为数组的键路径
- 将键路径连接在一起
- 了解键路径的类型
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}
用于存储数据的代码如下:
swift - Swift Generic Functions、Protocols 和 associatedType - 无法使用类型为“(来自:T)”的参数列表调用函数
我正在尝试为执行相同操作的不同类型对象概括一个函数(使用 keyPath 从对象中检索一个值)。
我在协议中使用了 associatedType,因为每个对象都有自己不同的字典。
函数 fillOutputs(container: inout T) 从对象中检索由键路径指定的参数的值并将其附加到数组中。
我在代码末尾的 container.outputs.append 行中收到错误,如下所示:无法使用类型为“(来自:T)”的参数列表调用“检索”。这是指检索(来自:容器)。在尝试概括之前,此函数是每个对象(容器)的方法,并且使用retrieve(from: self) 有效。
作为参考,retrieve 方法是另一个通用函数的一部分:
鉴于我不是 Swift 专家,也不是完全理解协议,我可能迷失在一杯水中,我将不胜感激任何想法/帮助。谢谢
swift - 如何在 KeyPath 中使用“Self.attr”?
我正在尝试在协议扩展中使用“Self.displayOrder”,但它会引发以下错误“线程 1:致命错误:无法从 KeyPath Swift.ReferenceWritableKeyPath 中提取字符串”
这是代码
swift - 使用协议定义具有不同值的 KeyPath 集合
假设您想要跟踪一个或多个唯一标识符。在这种情况下,A
有两个属性被认为是唯一的A
,而B
只有一个属性是唯一的B
。
如果只有一个唯一键,我们可以这样做:
...但这将我限制在一把钥匙上。