swift - 测试 KeyPath 指向的类型是否为 Set
问题描述
给定 a KeyPath<Root, Value>
,是否有一种干净的方法来测试是否Value.self
是 a Set
?对于 Core Data,我想指定一个接受 的 API KeyPath<Root, Value>
,并且可以使用它来确定它是否是toMany
关系。到目前为止,我最好的尝试是指定一个协议:
extension CollectionQueryable {
var isToMany: Bool {
return false
}
}
然后,让所有KeyPath
s 符合它:
extension KeyPath: CollectionQueryable { }
然后有条件地返回true
有效的两种情况:NSOrderedSet
和Set
。
extension KeyPath where Value == NSOrderedSet {
var isToMany: Bool {
return true
}
}
extension KeyPath where Value: Set {
var isToMany: Bool {
return true
}
}
但是编译器抱怨我没有指定Set
这里的泛型类型。如果我将它切换到Collection
,编译器会很高兴,但这不起作用,因为它返回true
when Value
is aString
在这种情况下是非常错误的。
解决方案
您可以通过使用重载函数来反转泛型的注入方式。这将使您避免缺少泛型问题,并且还具有在行为上明确的好处。
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
}
推荐阅读
- c# - 将日期时间转换为自定义格式
- laravel - 如何登录主域和子域多租户?
- python - 删除二进制阈值图像中具有连接边缘的小破折号
- azure - 将多行合并为具有百分比贡献的单行
- java - 我必须在 FutureTask 中手动处理中断吗?
- android - 如何为风味变体创建两个不同版本的代码
- c++ - 全局变量的初始化和函数内部静态变量的初始化一样吗
- flutter - Peope API 没有显示电子邮件地址,但其他所有在 Flutter 中都可以正常工作
- c# - EF Core 5 - 具有相同(相关)外键的多个导航属性?
- avro - 使用 Avro Schema 创建 n 叉树