首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将此enumerateDraggingItemsWithOptions方法调用转换为Swift?

如何将此enumerateDraggingItemsWithOptions方法调用转换为Swift?
EN

Stack Overflow用户
提问于 2014-10-26 05:07:22
回答 3查看 1.8K关注 0票数 2

名为CocoaDragAndDrop的示例应用程序使用一个名为enumerateDraggingItemsWithOptions的方法。这是在Obj:

代码语言:javascript
复制
    [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]];
            }
        }];

您将如何快速地编写这段代码?

我试过这样做:

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

        // ...

    }
)

我得到了以下错误:

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

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-10-31 09:00:16

Swift中的方法签名是

代码语言:javascript
复制
func enumerateDraggingItemsWithOptions(enumOpts: NSDraggingItemEnumerationOptions, 
  forView view: NSView, classes 
  classArray: [AnyObject], 
  searchOptions: [NSObject : AnyObject], 
  usingBlock block: (NSDraggingItem!, Int, UnsafeMutablePointer<ObjCBool>) -> Void)
  • 我们可以在回调中省略参数类型,因为它们是从声明中获得的,这使得代码更加清晰。
  • 回调是最后一个参数,因此我们可以使用尾随闭合语法。

调用方法

代码语言:javascript
复制
sender.enumerateDraggingItemsWithOptions(
  .Concurrent,
  forView: self,
  classes: [NSPasteboardItem.self],
  searchOptions: [NSPasteboardURLReadingFileURLsOnlyKey:self]) 
    {(draggingItem, idx, stop)  in
    // Code here
  }
票数 2
EN

Stack Overflow用户

发布于 2015-12-22 16:38:58

OS X 10.11中的签名已更改。

代码语言:javascript
复制
func enumerateDraggingItemsWithOptions(
  enumOpts: NSDraggingItemEnumerationOptions,
  forView view: NSView, 
  classes classArray: [AnyClass], 
  searchOptions: [String : AnyObject], 
  usingBlock block: (NSDraggingItem!, Int, UnsafeMutablePointer<ObjCBool>) -> Void) 

//因此,我们需要调整如下:

代码语言:javascript
复制
func f(sender:NSDraggingInfo) -> () {
  var v:NSView = NSView()
  let classArray:[AnyClass] = [NSPasteboardItem.self]
  let item = NSPasteboardItem()
  let searchOptions:[String:AnyObject] = [NSPasteboardURLReadingFileURLsOnlyKey:v]
票数 1
EN

Stack Overflow用户

发布于 2014-10-28 08:25:46

这将编译,因此显示了正确的语法。我显式地定义参数以澄清类型:

代码语言:javascript
复制
import Foundation
import AppKit

func f(sender:NSDraggingInfo) -> () {

   var v:NSView = NSView()
   let classArray:[AnyObject] = [NSPasteboardItem.self]
   let item = NSPasteboardItem()
   let searchOptions:[NSObject:AnyObject] = [NSPasteboardURLReadingFileURLsOnlyKey:v]

sender.enumerateDraggingItemsWithOptions(
  NSDraggingItemEnumerationOptions.Concurrent,
  forView: v,
  classes: classArray,
  searchOptions: searchOptions,
  usingBlock: { (draggingItem: NSDraggingItem!, idx: Int, stop: UnsafeMutablePointer<ObjCBool>) -> Void in

    // ...

  }
)
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26569991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档