首页 > 解决方案 > 测试 KeyPath 指向的类型是否为 Set

问题描述

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

extension CollectionQueryable {

    var isToMany: Bool {
        return false
    }
}

然后,让所有KeyPaths 符合它:

extension KeyPath: CollectionQueryable { }

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

extension KeyPath where Value == NSOrderedSet {

    var isToMany: Bool {
        return true
    }
}

extension KeyPath where Value: Set {

    var isToMany: Bool {
        return true
    }
}

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

标签: swiftgenericsswift-keypath

解决方案


您可以通过使用重载函数来反转泛型的注入方式。这将使您避免缺少泛型问题,并且还具有在行为上明确的好处。

func isToMany<Root, Value>(_ keyPath: KeyPath<Root, Value>) -> Bool {
    return false
}

func isToMany<Root>(_ keyPath: KeyPath<Root, NSOrderedSet>) -> Bool {
    return true
}

func isToMany<Root, Element>(_ keyPath: KeyPath<Root, Set<Element>>) -> Bool {
    return true
}

推荐阅读