我有一个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
。
无论如何,尽管它们具有相似的用途,但我认为您不能使用Any
将NSValue
转换为CGPoint
或CGRect
或从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/