我有一个NSValue对象,可以“装箱”未知类型(CGPoint,CGRect等)的实例,并且需要在运行时确定此类型。我将如何在Swift中进行操作?

我试图做这样的事情:

if ((value as Any) is CGPoint) {}
else if (((value as Any) is CGRect)) {}
...

value是包含CGPoint的NSValue对象时,它不会进入if子句。
然后,当我打印value时,它给了我NSPoint: {150, 150},我认为这就是为什么它从不进入子句的原因。

有什么想法为什么会发生以及如何解决?

非常感谢!

最佳答案

啊,NSValue,你太疯狂了。即使在iOS上不应该使用NSRect等,如果将CGRect放在NSValue内,内部也会显示NSRect

无论如何,尽管它们具有相似的用途,但我认为您不能使用AnyNSValue转换为CGPointCGRect或从value.CGRectValue()NSValue转换。您必须调用Any等。但是对于您来说,您需要知道它是哪一个。这也不容易,但是您可以执行以下操作:

let type = String.fromCString(val.objCType) ?? ""
if type.hasPrefix("{CGRect") {
    let rect = val.CGRectValue()
}
else if type.hasPrefix("{CGPoint") {
    let point = val.CGPointValue()
} //etc...

但是另一个问题是,您真的需要使用ojit_code吗?这是一种特定于Obj-C的解决方法。它是由您无法更改的东西提供给您的吗,还是您可以使用ojit_code(或更优的泛型)来更好?

关于ios - 如何知道使用Swift在NSValue中装箱的对象的类型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27605383/

10-12 01:49