Could it be that this is (just) a problem of the generated interface _view_ ? 
With

    extern NSAttributedStringKey ODRolloverTokenAttributeName;

in an Objective-C header the "Generated Interface" is displayed as

   public static let ODRolloverTokenAttributeName: NSAttributedStringKey

as you noticed, but I can use it from Swift as

   let key = NSAttributedStringKey.ODRolloverTokenAttributeName

so it is actually a property of NSAttributedStringKey, not a global variable. 
And with

   extern NSAttributedStringKey ODRolloverTokenAttributeName 
NS_SWIFT_NAME(rolloverToken);

in the Objective-C header I can use it from Swift as

   let key = NSAttributedStringKey.rolloverToken

So – unless I am misunderstanding something – the ODRolloverTokenAttributeName 
defined in the Objective-C header file is actually imported to Swift as an 
extension to NSAttributedStringKey, even if the generated interface view in 
Xcode displays it as a global variable.

Regards, Martin


> Am 27.09.2017 um 16:07 schrieb Marco Masser via swift-users 
> <swift-users@swift.org>:
> 
> Hi,
> 
> Swift 4 and the macOS 10.13 SDK added a new NSAttributedStringKey type for 
> the keys that NSAttributedStrings use. The keys are then defined in an 
> extension of NSAttributedStringKey, essentially like this in AppKit:
> 
> // AppKit/NSAttributedString.h (Objective-C)
> extern NSAttributedStringKey NSFontAttributeName;
> 
> // Generated Swift Interface
> extension NSAttributedStringKey {
>     public static let font: NSAttributedStringKey
> }
> 
> 
> How do I get my own custom NSAttributedStringKeys to be imported this way? 
> When I do it like AppKit, it doesn’t seem to work:
> 
> // My Objective-C header
> extern NSAttributedStringKey ODRolloverTokenAttributeName;
> 
> // Generated Swift Interface
> static let ODRolloverTokenAttributeName: NSAttributedStringKey
> 
> 
> That is obviously not the same. I tried using the NS_SWIFT_NAME macro, but 
> that results in the symbol disappearing in Swift completely:
> 
> // My Objective-C header
> extern NSAttributedStringKey ODRolloverTokenAttributeName 
> NS_SWIFT_NAME(NSAttributedStringKey.rolloverToken);
> 
> 
> I also tried to use the swift_name attribute that is used by the 
> NS_SWIFT_NAME macro and that is even mentioned in SE-0044 for exactly this 
> purpose, but the symbol still disappears:
> https://github.com/apple/swift-evolution/blob/master/proposals/0044-import-as-member.md#swift_name-attribute
> 
> extern const NSAttributedStringKey ODRolloverTokenAttributeName 
> __attribute__((swift_name("NSAttributedStringKey.rolloverToken")));
> 
> 
> What works is to manually define it in an extension like this, but that’s no 
> fun:
> 
> // My Objective-C header
> extern NSAttributedStringKey ODRolloverTokenAttributeName 
> NS_REFINED_FOR_SWIFT;
> 
> extension NSAttributedStringKey {
>     static let rolloverToken = 
> NSAttributedStringKey(__ODRolloverTokenAttributeName.rawValue)
> }
> 
> 
> Is there no way to import this automatically? Was this functionality removed 
> before release even though it was mentioned in SE-0044?
> 
> Cheers,
> 
> Marco
> _______________________________________________
> swift-users mailing list
> swift-users@swift.org
> https://lists.swift.org/mailman/listinfo/swift-users

_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

Reply via email to