從brandonhamilton/image-capture-core-rs'sICCameraDevice.mediaFiles()我可以得到NSArray::count()(來自core-foundation-rs):
let cam_media_files = camera_device.mediaFiles();
println!(
NSArray::count(cam_media_files) // 123
);
但是你怎么能迭代Object呢?
我嘗試了幾件事:
// 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
我錯過了什么?
謝謝你?????♂?
uj5u.com熱心網友回復:
你錯過了.iter():
for media_file in cam_media_files.iter() {
在 ObjC 中, NSArray 實作了NSFastEnumeration,這就是 ObjC 實作其for...in語法的方式。
這個箱子的橋梁到 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)
uj5u.com熱心網友回復:
根據檔案,NSArray有一個objectAtIndex方法,所以這應該有效:
for idx in 0..NSArray::count (cam_media_files) {
let media_file = NSArray::objectAtIndex (cam_media_files, idx);
// ...
}
或者如果你想用迭代器來做:
for media_file in (0..NSArray::count (cam_media_files)).map (|idx| NSArray::objectAtIndex (cam_media_files, idx)) {
// ...
}
uj5u.com熱心網友回復:
我對 Cocoa 不是很了解,我只是給你一個路徑,希望可以幫助你找到解決方案。
你用做let cam_media_files = camera_device.mediaFiles();和mediaFiles(self) -> id;
id 是什么?
pub type id = *mut runtime::Object;
關于 runtime::Object 的檔案是https://docs.rs/objc/0.2.7/objc/,您可以使用 msg_send!crate 呼叫 Cocoa 方法
let cls = class!(NSObject);
let obj: *mut Object = msg_send![cls, new];
let hash: usize = msg_send![obj, hash];
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/312585.html
上一篇:類內的按鈕動作選擇器
