gpt4 book ai didi

swift - 如何测试对象是否继承或者是泛型类的成员?

转载 作者:行者123 更新时间:2023-11-30 12:24:40 27 4
gpt4 key购买 nike

假设我有一个类class C<T> .

我想写一个函数f(_ a: Any) -> Bool ,当 a 时返回 true是继承自 C 的类的成员(或者是 C 本身)。我不关心专业:通过 C<Int> , C<Double> , C<Whatever>应该全部返回 true

看起来我应该可以写 a is Ca as? C != nil然而,作为该函数的主体,它们都不能在 Playground 中编译; swiftc 提示“在转换为‘C<_>’时无法推断通用参数‘T’”。如果我写f C里面作为实例方法,C隐含地 C<T> ,所以写let c = C<Int>(); c.f(C<Double>())返回false

我可以通过编写协议(protocol) P 来解决这个问题,其中C符合,然后进行测试,但我不认为这是一个好的解决方案;这只是一个黑客行为。

有什么办法可以做到这一点吗?

这是我为尝试此操作而编写的所有代码:

class C<T> {
func test(_ a: Any) -> (Bool, Bool) {
return (type(of: a) == C.self, a is C)
}
}

class D: C<Double> { }

let d = D()

func f(_ a: Any) -> Bool {
return a is C // generic parameter 'T' could not be inferred in cast to 'C<_>'
}

d.test(C<Int>()) // false, false

// bad solution

protocol P { }

extension C: P { }

d is P // true

最佳答案

我认为不存在可以执行此操作的语言功能,因为仅知道对象是或 C 的子类是没有用的。本身,而不知道泛型类型参数。

我的意思是,知道之后你会做什么,是的,someObj确实是 C<Something> 类型,但不是Something是?你不能用 someObject 做任何事。您无法转换它,因此您无法访问它的任何成员。

Swift 的泛型非常非常严格,不像 Java,Java 只是在运行时将泛型类型扔出窗口......

如果您坚持要这样做,那么您唯一的选择就是使用您提到的技巧。

或者,如果您只想检查是否 aC它本身,而不是它的任何子类,您可以使用它(只是为了好玩):

func f(a: Any) -> Bool {
let regex = try! NSRegularExpression(pattern: "C<.+>")
let typeString = String(describing: type(of: a))
let range = NSRange(location: 0, length: typeString.characters.count)
let matchRange = regex.rangeOfFirstMatch(in: typeString, range: range)
return range.toRange() == matchRange.toRange()
}

关于swift - 如何测试对象是否继承或者是泛型类的成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44350689/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com