来自 brandonhamilton/image-capture-core-rs
的 ICCameraDevice.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/