+1, missed this on a number of occasions.
> On Mar 31, 2017, at 5:00 PM, Charles Srstka via swift-evolution > <[email protected]> wrote: > > MOTIVATION: > > Sometimes, it’s necessary to write a top-level C function in order to > interact with some C-based code. This can come up, for example, when making a > new port for a cross-platform app that implements OS-dependent functionality > via C functions. More urgently, though, it also pops up in certain Apple > APIs, such as the standard QuickLook plug-in template. In order to write a > QuickLook plug-in, developers are required to write implementations for > certain predefined C functions, such as GeneratePreviewForURL(), > GenerateThumbnailForURL(), CancelPreviewGeneration(), and > CancelThumbnailGeneration(). Unfortunately, this API contract cannot be met > in Swift. Currently, Swift can only expose class members to C/Objective-C, > which means that implementing a QuickLook plug-in involves a rather awkward > series of hoops to jump through: > > GeneratePreview.swift: > > class QLGlue: NSObject { > @objc static func generatePreview(_: UnsafeMutableRawPointer, request > preview: QLPreviewRequest, url: URL, contentTypeUTI: String, options: [String > : Any]) -> OSStatus { > // generate the preview > } > } > > GeneratePreview.m: > > #import “MyProject-Swift.h" > > OSStatus GeneratePreviewForURL(void *thisInterface, QLPreviewRequestRef > request, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options) { > return [QLGlue generatePreview:thisInterface request:request url:(__bridge > NSURL *)url contentTypeUTI:(__bridge NSString *)contentTypeUTI > options:(__bridge NSDictionary *)options]; > } > > PROPOSED SOLUTION: > > Allow the @objc on top-level functions. This will cause the functions to be > exposed as C functions, satisfying contracts such as Apple’s QuickLook > plug-in contract, and allowing developers to just write: > > @objc func generatePreview(_: UnsafeMutableRawPointer, _ preview: > QLPreviewRequest, _ url: CFURL, _ contentTypeUTI: CFString, _ options: > CFDictionary) -> OSStatus { > // generate the preview > } > > This would eliminate an entire source file of glue code. > > IMPACT ON EXISTING CODE: > > None, since @objc is not currently allowed on top-level functions. This is > purely additive. > > Charles > > _______________________________________________ > swift-evolution mailing list > [email protected] > https://lists.swift.org/mailman/listinfo/swift-evolution _______________________________________________ swift-evolution mailing list [email protected] https://lists.swift.org/mailman/listinfo/swift-evolution
