objective-c - 如何将此 enumerateDraggingItemsWithOptions 方法调用转换为 Swift?

标签 objective-c macos cocoa swift

示例应用程序名为 CocoaDragAndDrop使用名为 enumerateDraggingItemsWithOptions 的方法。这是 Obj-C 中的:

    [sender enumerateDraggingItemsWithOptions:NSDraggingItemEnumerationConcurrent 
        forView:self
        classes:[NSArray arrayWithObject:[NSPasteboardItem class]] 
        searchOptions:nil 
        usingBlock:^(NSDraggingItem *draggingItem, NSInteger idx, BOOL *stop) {


            if ( ![[[draggingItem item] types] containsObject:kPrivateDragUTI] ) {

                *stop = YES;

            } else {

                [draggingItem setDraggingFrame:self.bounds contents:[[[draggingItem imageComponents] objectAtIndex:0] contents]];
            }
        }];

你会如何用 swift 编写这段代码?

我尝试过这样的:

sender.enumerateDraggingItemsWithOptions(
    enumOptions: NSDraggingItemEnumerationOptions.Concurrent,
    forView: self,
    classes: [NSPasteboardItem.self],
    searchOptions: NSPasteboardURLReadingFileURLsOnlyKey,
    usingBlock: { (draggingItem: NSDraggingItem, idx: Int, stop: UnsafeMutablePointer<ObjCBool>) -> Void in

        // ...

    }
)

我收到以下错误:

Cannot convert the expression's type '(enumOptions: NSDraggingItemEnumerationOptions, forView: DragDropImageView, classes: $T5, searchOptions: NSString!, usingBlock: (NSDraggingItem, Int, UnsafeMutablePointer<ObjCBool>) -> Void)' to type 'NSPasteboardItem.Type'

最佳答案

Swift 中的方法签名是

func enumerateDraggingItemsWithOptions(enumOpts: NSDraggingItemEnumerationOptions, 
  forView view: NSView, classes 
  classArray: [AnyObject], 
  searchOptions: [NSObject : AnyObject], 
  usingBlock block: (NSDraggingItem!, Int, UnsafeMutablePointer<ObjCBool>) -> Void)
  • 我们可以省略回调中的参数类型,因为它们是从声明中获取的, 这使得代码更加干净
  • 回调是最后一个参数,因此我们可以使用 trailing closure语法

调用方法

sender.enumerateDraggingItemsWithOptions(
  .Concurrent,
  forView: self,
  classes: [NSPasteboardItem.self],
  searchOptions: [NSPasteboardURLReadingFileURLsOnlyKey:self]) 
    {(draggingItem, idx, stop)  in
    // Code here
  }

关于objective-c - 如何将此 enumerateDraggingItemsWithOptions 方法调用转换为 Swift?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26569991/

相关文章:

ios - 无法在 iOS 中使用 Google Drive api v3 列出特定文件夹中的文件

objective-c - 如何对 NSMutableArray 进行排序

ios - 如何使用 presentViewController 呈现 iOS 键盘扩展

macos - Lesscss 命令行编译器 Lessc

iphone - <AppName>.pch 文件使用

objective-c - 在 Obj-C 中没有 Foundation Framework 是否可以实现标准 NS 类?

macos - 如何实现 NSCollectionView 的上下文菜单

objective-c - 制作一个 int 的 getter/setter?

regex - sed 中的反向引用返回错误值

macos - 如何以编程方式在 OSX 中找到我的 Google Drive 文件夹?