gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 09:03:57 25 4
gpt4 key购买 nike

来自 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com