[英]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兼容属性。
第二, NSObject
与AnyObject
类似,但是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.