繁体   English   中英

在Swift中追加两个键路径

[英]Appending two keypaths in Swift

我正在尝试在Swift(4)中追加两个KeyPath,但是编译器要么不允许我执行,要么尽管是有效的密钥路径,结果还是为“ nil”。

类别:

import Foundation

@objcMembers
class Foo: NSObject
{
    @objc public dynamic var items = [1, 2, 3]
}

@objcMembers
class Bar: NSObject
{
    @objc public dynamic var source: NSObject?
}

范例1:

let keyPath1 = \Bar.source
let keyPath2 = \Foo.items
keyPath1.appending(path: keyPath2) // error: cannot convert value of type 'ReferenceWritableKeyPath<Foo, [Int]>' to expected argument type 'WritableKeyPath<_, _>' keyPath1.appending(path: keyPath2)

范例2:

let keyPath1: WritableKeyPath<Bar, NSObject?> = \Bar.source
let keyPath2: ReferenceWritableKeyPath<Foo, [Int]> = \Foo.items
keyPath1.appending(path: keyPath2) // error: ambiguous reference to member 'appending(path:)' 

范例3:

let keyPath1: AnyKeyPath = \Bar.source
let keyPath2: ReferenceWritableKeyPath<Foo, [Int]> = \Foo.items
keyPath1.appending(path: keyPath2) // returns nil

这里的类有意使用NSObject类型的可选成员。 产生的的keyPath应source.items其上的实例Foo是一个有效的keyPath。

新的Swift 4 keyPath类型的正确组合是什么才能使这项工作有效?

首先,使用Swift 4键路径,不需要从NSObject继承对象(甚至不是类), 也不需要具有KVC兼容属性。

第二, NSObjectAnyObject类似,但是Swift 4的关键路径需要具体的静态类型。

最后,属性source是可选的,因此您必须解开密钥路径才有效。


为了能够串联关键路径,第一关键路径的最后一个组成部分必须与第二关键路径的第一个组成部分具有相同的类型

这是WWDC 2017-Session 212.appending规则 :Foundation中的新增功能

在此处输入图片说明

您可以通过这种方式附加关键路径

class Foo {
    var items = [1, 2, 3]
}


class Bar {
    var source: Foo?
}

let bar = Bar()
bar.source = Foo()

let keyPath1 = \Bar.source!
let keyPath2 = \Foo.items
let keyPath = keyPath1.appending(path: keyPath2)

let items = bar[keyPath:keyPath]
print(items)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM