问题标签 [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.
swift - 使用 KeyPath 访问子类成员
KeyPath
当我遇到奇怪的事情时,我试图访问子类成员。看看这两个简单的类:
现在,如果我有以下代码:
我会得到一个运行时错误。您似乎无法使用WriteableKeyPath
. 但以下代码有效:
我可以使用此代码同时访问\B.a
和\B.c
。知道为什么会这样吗?
由于 using 返回的对象AnyKeyPath
是不可变的,我将无法使用它来更新对象。我想知道是否有任何解决方法可以使用KeyPath
父类更新子类成员。
更新:
为了详细说明,这里再举一个例子:
我认为这可能非常有用。
swift - 观察 Swift KeyPaths 列表
我有以下代码在两个属性上添加了一个观察者:
它有效,但我不喜欢重复。我试图传递一个 KeyPaths 列表:
但我得到编译器错误:Generic parameter 'Value' could not be inferred
有没有办法做到这一点?
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 中有效,并且找不到任何弃用文档。有人知道这个问题吗?
ios - Swift 将键路径作为 func 的参数传递
我需要能够将#keypath 传递给一个函数来过滤我的CoreData 记录。
我这样做:
但是可以肯定 #keyPath 不是类型,如何正确执行?或者我是否需要准备一个过滤后的字符串,我将把它传递给一个像谓词一样的函数?
swift - KVC的优势
我一直试图弄清楚这一点,但无法理解 KVC 的优势,除了:
- 编译器检查(从而避免字符串类型的代码)
- 与 KVO 一起使用
我不确定除了上面提到的 2 个案例(我知道我可能错了)之外,使用 KVC 是否有任何优势,但我找不到一个!
就像考虑以下代码:
我的意思是我为什么要使用:
让 firstNameKey = \Profile.firstName
profile1[keyPath: firstNameKey] /* 返回字符串 "John" */
代替 :
profile1.firstName // 返回字符串“John”
如果有人有一些代码示例/示例,那么如果他们可以使用 swift 进行解释,那就太好了(因为我的 Objective-C 不好)
ios - 如何修复错误:二元运算符“==”不能应用于“NSExpression.ExpressionType”和“_”类型的操作数
我正在浏览 HomeKit 目录中的旧代码:当我遇到一个表达式时,创建家庭、配对和控制配件以及设置触发器
我不知道是什么
在
是指在左侧
当我搜索谷歌并堆栈溢出“KeyPathExpressionType”时,我什么也没找到。这是一样的
我什么也没找到。
这些相等比较中的每一个
和
在下面的代码中,生成一条错误消息,内容为:
二元运算符“==”不能应用于“NSExpression.ExpressionType”和“_”类型的操作数
更换时错误消失
和
和
和
这个对吗?谁能告诉我这个问题的启发?
swift - “__lldb_expr_18”是什么意思?
我正在操场上使用功能性 swift 库,并使用键路径进行一些操作。
当我运行时: prop(\User.favoriteFoods) <<< map <<< prop(.name)
我得到:((字符串)->字符串)->(__lldb_expr_18.User)->__lldb_expr_18.User
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.md下keyPath
标是在扩展名上定义的Any
,我认为T
应该也成为一个Any
。
在Any
某种程度上(<- 我不得不这样做),我确信我已经看到keyPath
s 被用于泛型(我不完全理解泛型和关联类型的不同之处)。那么有没有人知道keyPath
在这种情况下可能导致下标不可用的原因是什么?仅仅是因为它是一个关联类型,有什么办法可以让这个工作吗?
更新
t
如果我通过将其转换为来擦除类型,Any
我仍然会收到no subscripts
错误,如果我将其转换为,AnyObject
我不会收到下标错误,但我仍然会收到Cannot create a single-element tuple
我不理解的,因为我没有尝试制作元组,我正在使用下标。
ios - 带有 UIButtons 的 Swift Keypath
我正在尝试获取类中 IBOutlet 的选定属性的键路径。但是得到:
Type 'UIButton?' has no member 'isSelected'
直接访问 UIButton.isSelected 键路径有效,但不能满足我的用例。
我错过了什么?
swift - 通过 KeyPath 设置数组的值
我正在尝试通过使用 KeyPaths 更新存储在类的数组属性中的值。这是我的代码:
问题是当我这样调用这个函数时:
whereviewers
是 type [ViewersModel]
,它总是返回以下错误:
我该如何解决这个问题?我有一个类似版本的代码,但property
参数不是数组,并且有效。