objective-c - Rust Cocoa - 如何迭代 NSArray

来自 brandonhamilton/image-capture-core-rsICCameraDevice.mediaFiles() 我可以得到 NSArray::count() (来自 core-foundation-rs ):

let cam_media_files = camera_device.mediaFiles();

println!(
  NSArray::count(cam_media_files)  // 123
);

但是如何迭代这个对象呢?

我尝试了一些事情:

// for media_file in NSArray::array(nil, cam_media_files) {
// for media_file in NSArray::arrayWithObject(nil, cam_media_files) {
for media_file in cam_media_files {
    println!("  ?? media_file: {:?}", media_file);
}

所有结果都是这样的:

error[E0277]: `*mut Object` is not an iterator
  --> src/image_capture_core_mod.rs:86:31
   |
86 |             for media_file in cam_media_files {
   |                               ^^^^^^^^^^^^^^^ `*mut Object` is not an iterator
   |
   = help: the trait `Iterator` is not implemented for `*mut Object`
   = note: required because of the requirements on the impl of `IntoIterator` for `*mut Object`
   = note: required by `into_iter`

这里没什么用: https://docs.rs/cocoa/0.24.0/cocoa/foundation/trait.NSArray.html

我错过了什么?

谢谢??‍♂️

最佳答案

你错过了 .iter():

for media_file in cam_media_files.iter() {

在 ObjC 中,NSArray 实现了 NSFastEnumeration ,这就是 ObjC 实现其 for...in 语法的方式。

这个 crate 到 NSFastEnumeration 的桥梁提供了 iter(),它返回一个 NSFastIterator . (NSFastIterator 不是 Cocoa 类型。这是这个 crate 提供的东西,用于将 NSFastEnumeration 桥接到 Iterator。)

请注意,这个 crate 将 NSFastEnumeration 应用于所有对象类型(这就是 id 的意思),甚至那些在 Cocoa 中没有实现 NSFastEnumeration 的对象类型。这意味着您可以迭代任何...但是如果 Cocoa 不支持它,它将在运行时崩溃,并且您不会收到编译时警告或错误:

let string = cam_media_files.objectAtIndex(0);
for x in string.iter() {} // *Crash* (NSString doesn't support this)

https://stackoverflow.com/questions/69341406/

相关文章:

reactjs - 如何去除 Material-UI 对话框中的阴影?

c# - 通过列表循环 foreach,为不同的值执行代码

loops - 如何在 Kotlin 循环内更改 for 循环的计数器变量值?

c# - 在 C# 中,如何使用 `TryAsync` 的实例?

c - 尝试将二维字符串数组传递给函数并打印它

python - 如何旋转图像以获得非空像素?

node.js - 类型错误 : Cannot read property 'passport' o

ios - 更改 iOS 15 中导航栏的当前颜色

c - 打印 int_fast_32_t 等数据类型的可移植和正确方法是什么

javascript - Cypress 最佳实践 - 存储和比较两个值