问题标签 [swift-keypath]

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 投票
0 回答
52 浏览

swift - 通用 NSKeyValueObservedChange/Keypath

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

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

但比我得到的错误:

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

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

0 投票
1 回答
342 浏览

swift - 如何更新此类以支持将键路径值绑定到函数?

我有一个类允许我将属性声明为Bindable

这样做允许将更改直接绑定到 UI 元素。

这是基于在此处找到的一篇文章

我想做的也是能够将属性绑定到函数。

绑定值的当前语法类似于 -

user.bind(\.name, to: label, \.text)

但我想扩展它,以便该键路径上的属性可以调用一个方法。

有点像 -

在这种情况下doSomething,可以调用一个助手NSAttributedString并接受该name道具作为要在该助手中使用的参数。

我在RxSwift使用bind(onNext: ....).

我尝试使用 -

位我收到以下错误-

函数签名中未使用通用参数“O”

无法推断通用参数“O”

0 投票
0 回答
72 浏览

swift - Swift:为什么我们需要 keypath

我知道如何使用 keypath,但我对为什么要使用它感到困惑?

例如,假设我们有 A 类和 B 类,A 类有 B 类的对象

我可以使用密钥路径 Ex 访问 B 类中的 myName:

但是,我可以用这种方式做同样的事情

那么为什么我们需要密钥路径!

0 投票
2 回答
91 浏览

swift - 测试 KeyPath 指向的类型是否为 Set

给定 a KeyPath<Root, Value>,是否有一种干净的方法来测试是否Value.self是 a Set?对于 Core Data,我想指定一个接受 的 API KeyPath<Root, Value>,并且可以使用它来确定它是否是toMany关系。到目前为止,我最好的尝试是指定一个协议:

然后,让所有KeyPaths 符合它:

然后有条件地返回true有效的两种情况:NSOrderedSetSet

但是编译器抱怨我没有指定Set这里的泛型类型。如果我将它切换到Collection,编译器会很高兴,但这不起作用,因为它返回truewhen Valueis aString在这种情况下是非常错误的。

0 投票
1 回答
857 浏览

swift - 在 Swift 中动态分配结构的属性

我有这个结构:

我希望每个属性的值成为属性本身的字符串。像这样:

但无论属性的数量或其价值如何,我都想完成:

我试过这个:

但我知道这不是 KeyPath 的工作方式......可能也存在类型安全问题。任何想法?

0 投票
1 回答
1892 浏览

swift - Swift ReferenceWritableKeyPath 如何与 Optional 属性一起使用?

存在的基础:在阅读之前,了解您不能通过imagekeypath 将 UIImage 分配给图像视图插座的属性会有所帮助\UIImageView.image。这是财产:

现在,这会编译吗?

不!

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

好的,现在我们已经为实际用例做好了准备。


我实际上想了解的是 Combine 框架.assign订阅者如何在幕后工作。为了进行实验,我尝试使用自己的 Assign 对象。在我的示例中,我的发布者管道生成一个 UIImage 对象,并将其分配给imageUIImageView property 的属性self.iv

如果我们使用该.assign方法,它将编译并工作:

所以,我对自己说,要看看它是如何工作的,我将删除.assign并用我自己的 Assign 对象替换它:

哗啦啦!我们不能这样做,因为UIImageView.image它是一个可选的 UIImage,而我的发布者生成了一个简单明了的 UIImage。

我试图通过在键路径中展开 Optional 来解决这个问题:

酷,编译。但它在运行时崩溃,大概是因为图像视图的图像最初是nil.

现在我可以通过map在我的管道中添加一个将 UIImage 包装在 Optional 中的管道来解决所有这些问题,以便所有类型都正确匹配。但我的问题是,这到底是如何工作的?我的意思是,为什么我不必在我使用的第一个代码中这样做.assign?为什么我可以在.image那里指定密钥路径?关于关键路径如何与可选属性一起工作似乎有些技巧,但我不知道它是什么。


在 Martin RI 的一些输入之后意识到,如果我们pub显式键入作为生成,我们将获得与添加将 UIImage 包装在 Optional 中的UIImage?效果相同的效果。map所以这编译和工作

这仍然不能解释原件是如何.assign工作的。似乎它能够将类型可选性通过管道推送到运算符中。但我不明白这怎么可能。.receive

0 投票
0 回答
149 浏览

swift - 更多关于带有 Optional 属性的 ReferenceWritableKeyPath 的奇怪行为

(我在标题中说“更多”,因为这个问题是我的How does Swift ReferenceWritableKeyPath work with an Optional property? 的附录?。)

在我的代码中,self.iv是一个插座属性:

现在,这会编译吗?

不!我们被告知这里的某些东西必须打开,尽管它是什么并不完全清楚:

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

但现在看这个。我将只制作一个图像视图,而不是一个插座:

编译!为什么?UIImageView 属性和 UIImageView 本地之间有什么语义/句法区别?是否该属性是隐式展开的 Optional?

为了测试这个想法,让我们通过本地“传播”self.iv 显式展开:

那也编译!但是我们必须使用单独的本地;仅仅self.iv直接展开是不够的:

我根本不明白这一点。它违背了我关于隐式展开的 Optional 是什么以及如何始终将非 Optional 分配给包装相同类型的 Optional 的标准信念。关于 ReferenceWritableKeyPath 的一些东西似乎与 Optional 属性一起工作很奇怪,但我不能把手指放在它上面。

所以我的问题是(抱歉,可能有点含糊):有人可以证明所有这些结果的合理性,并使它们看起来合理且可预测吗?这里有什么规则?

注意:可能与https://bugs.swift.org/browse/SR-11184相同

0 投票
2 回答
415 浏览

ios - Fatal error: could not demangle keypath type

I have a simple class and I want to use keypath in the init, something like this:

When I run this code I get a runtime error:

Fatal error: could not demangle keypath type from ' ����XD':

But, if I specify the type in keyPath it works fine:

But, what's even stranger is that this code works:

What is the actual reason for this error?

0 投票
1 回答
3604 浏览

swift - 键路径值类型“Data.Element.ID”无法转换为上下文类型“ID”

Key path value type 'Data.Element.ID' cannot be converted to contextual type 'ID'当传递的数据包含已经从 Identifiable 继承的元素时,尝试在下面的扩展中创建初始化程序时出现错误。

0 投票
2 回答
518 浏览

xcode - 在列表 Swift UI 中指定键路径

我有以下结构,其中GroceryData有关于部分的详细信息[GrocerySection],这反过来又具有要在部分中显示的项目[Grocery]

可识别属性的关键路径应该是什么。

在此处输入图像描述