示例应用程序名为 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/