xcode报错Incompatible types casting 'const simd_float2 *' to 'NSArray *' with a _

73 阅读2分钟

在Objective-C中,使用__bridge进行类型转换时,必须确保转换的类型是兼容的。将const simd_float2 *类型转换为NSArray *类型是不兼容的,因此会导致编译错误。

具体分析如下:

  1. Objective-C中的bridged casts:Objective-C中的bridged casts(如__bridge)用于在ARC(自动引用计数)管理和非ARC管理之间转移对象。但是,这些casts有严格的限制,不能将Objective-C对象指针转换为void*,也不能将不兼容的指针类型直接转换。
  2. 类型转换的兼容性:在C/C++中,类型转换需要确保源类型和目标类型是兼容的。例如,const simd_float2 *是一个指向simd_float2结构体常量指针,而NSArray *是一个指向Objective-C数组对象的指针。两者之间没有直接的兼容性,因此不能直接进行转换。
  3. 错误示例:在C/C++中,尝试将一个指针类型转换为另一个不兼容的指针类型会导致编译错误。例如,将void **转换为const float *会导致编译器警告或错误,因为这两种指针类型不兼容。
  4. ARC下的桥接规则:在ARC环境下,Objective-C对象和Core Foundation对象之间的转换需要使用bridged casts,如__bridge、__bridge_retained和__bridge_transfer。但是,这些规则仅适用于Objective-C对象和Core Foundation对象之间的转换,而不适用于其他不兼容的类型之间的转换。

综上所述,将const simd_float2 *类型转换为NSArray *类型是不兼容的,因此会导致编译错误。要解决这个问题,需要重新考虑数据结构的设计,或者使用合适的方法将数据从simd_float2转换为适合存储在NSArray中的格式。例如,可以将simd_float2的数据提取出来,存储为NSNumber对象,然后将这些NSNumber对象添加到NSArray中。