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

标签 objective-c cocoa rust iterator 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)

关于objective-c - Rust Cocoa - 如何迭代 NSArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69341406/

相关文章:

objective-c - 基于 View 的 NSTableView 中的自定义背景

rust - 使用 syn 时如何从 Option<T> 获取 T?

objective-c - 如何检查JSON后返回值

objective-c - 扩展核心数据生成的 NSManagedObject 类

swift - takeValueFrom 立即更新

objective-c - 非 Cocoa 命令行应用程序是否与 Mac App Store 兼容?

objective-c - 尝试 segue 时旋转中断

ios - 从另一个类更新 textField 的文本

rust - 如何使用分隔符将 HashSet 的元素连接到字符串中

rust - 将 libc::getcwd 的输出转换为字符串