问题标签 [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 回答
149 浏览

swift - 使用 KeyPath 访问子类成员

KeyPath当我遇到奇怪的事情时,我试图访问子类成员。看看这两个简单的类:

现在,如果我有以下代码:

我会得到一个运行时错误。您似乎无法使用WriteableKeyPath. 但以下代码有效:

我可以使用此代码同时访问\B.a\B.c。知道为什么会这样吗?

由于 using 返回的对象AnyKeyPath是不可变的,我将无法使用它来更新对象。我想知道是否有任何解决方法可以使用KeyPath父类更新子类成员。

更新:

为了详细说明,这里再举一个例子:

我认为这可能非常有用。

0 投票
1 回答
795 浏览

swift - 观察 Swift KeyPaths 列表

我有以下代码在两个属性上添加了一个观察者:

它有效,但我不喜欢重复。我试图传递一个 KeyPaths 列表:

但我得到编译器错误:Generic parameter 'Value' could not be inferred

有没有办法做到这一点?

0 投票
1 回答
724 浏览

ios - INIntent `setImage` 使 Swift 5 中的运行时崩溃

自从添加了 Siri 快捷方式后,我就使用INIntent了对象。为此,我做了一个意图定义,它INIntent自动生成了一个对象。

为了自定义 Siri 快捷语音记录屏幕,我添加了一个便利初始化程序。基本上是添加suggestedInvocationPhrase顶部图标图像。

今天,我尝试将整个项目转换为 Swift 5,并且构建没有问题。(代码中没有实际的变化。)但是它在运行时崩溃并带有非常奇怪的消息。

线程 1:致命错误:无法解开关键路径类型XXXX9SpotConditionIntentCXD

它指出了setImage(inImage, forParameterNamed: \.spotName).

我刚刚发现setImage(,forParameterNamed)文档中不存在。

在此处输入图像描述

https://developer.apple.com/documentation/sirikit/inintent

好像我需要使用func keyImage() -> INImage?iOS 12 中添加的。

但我不知道为什么它在 Swift 4.X 中有效,并且找不到任何弃用文档。有人知道这个问题吗?

0 投票
1 回答
701 浏览

ios - Swift 将键路径作为 func 的参数传递

我需要能够将#keypath 传递给一个函数来过滤我的CoreData 记录。

我这样做:

但是可以肯定 #keyPath 不是类型,如何正确执行?或者我是否需要准备一个过滤后的字符串,我将把它传递给一个像谓词一样的函数?

0 投票
1 回答
583 浏览

swift - KVC的优势

我一直试图弄清楚这一点,但无法理解 KVC 的优势,除了:

  1. 编译器检查(从而避免字符串类型的代码)
  2. 与 KVO 一起使用

我不确定除了上面提到的 2 个案例(我知道我可能错了)之外,使用 KVC 是否有任何优势,但我找不到一个!

就像考虑以下代码:

我的意思是我为什么要使用:

让 firstNameKey = \Profile.firstName

profile1[keyPath: firstNameKey] /* 返回字符串 "John" */

代替 :

profile1.firstName // 返回字符串“John”

如果有人有一些代码示例/示例,那么如果他们可以使用 swift 进行解释,那就太好了(因为我的 Objective-C 不好)

0 投票
1 回答
312 浏览

ios - 如何修复错误:二元运算符“==”不能应用于“NSExpression.ExpressionType”和“_”类型的操作数

我正在浏览 HomeKit 目录中的旧代码:当我遇到一个表达式时,创建家庭、配对和控制配件以及设置触发器

我不知道是什么

是指在左侧

当我搜索谷歌并堆栈溢出“KeyPathExpressionType”时,我什么也没找到。这是一样的

我什么也没找到。

这些相等比较中的每一个

在下面的代码中,生成一条错误消息,内容为:

二元运算符“==”不能应用于“NSExpression.ExpressionType”和“_”类型的操作数

更换时错误消失

这个对吗?谁能告诉我这个问题的启发?

0 投票
0 回答
87 浏览

swift - “__lldb_expr_18”是什么意思?

我正在操场上使用功能性 swift 库,并使用键路径进行一些操作。

当我运行时: prop(\User.favoriteFoods) <<< map <<< prop(.name)

我得到:((字符串)->字符串)->(__lldb_expr_18.User)->__lldb_expr_18.User

0 投票
0 回答
137 浏览

swift - 在关联类型对象上使用 KeyPaths

我正在使用 Vapor 3 和 Swift 5 制作后端。在某些方面,我试图KeyPath在关联类型上使用 a ,如下所示:

但我得到了那个Value of type Self.T has no subscripts错误。我查看并根据此:https://github.com/apple/swift-evolution/blob/master/proposals/0161-key-paths.mdkeyPath标是在扩展名上定义的Any,我认为T应该也成为一个Any

Any某种程度上(<- 我不得不这样做),我确信我已经看到keyPaths 被用于泛型(我不完全理解泛型和关联类型的不同之处)。那么有没有人知道keyPath在这种情况下可能导致下标不可用的原因是什么?仅仅是因为它是一个关联类型,有什么办法可以让这个工作吗?

更新

t如果我通过将其转换为来擦除类型,Any我仍然会收到no subscripts错误,如果我将其转换为,AnyObject我不会收到下标错误,但我仍然会收到Cannot create a single-element tuple我不理解的,因为我没有尝试制作元组,我正在使用下标。

0 投票
1 回答
405 浏览

ios - 带有 UIButtons 的 Swift Keypath

我正在尝试获取类中 IBOutlet 的选定属性的键路径。但是得到: Type 'UIButton?' has no member 'isSelected'

直接访问 UIButton.isSelected 键路径有效,但不能满足我的用例。

我错过了什么?

0 投票
1 回答
160 浏览

swift - 通过 KeyPath 设置数组的值

我正在尝试通过使用 KeyPaths 更新存储在类的数组属性中的值。这是我的代码:

问题是当我这样调用这个函数时:

whereviewers是 type [ViewersModel],它总是返回以下错误:

我该如何解决这个问题?我有一个类似版本的代码,但property参数不是数组,并且有效。