[swift-users] How do you declare a custom NSAttributedStringKey in Objective-C for Swift use?

Jordan Rose jordan_rose at apple.com
Wed Sep 27 14:38:45 CDT 2017


Oh, whoops! Good catch, Martin. I guess I was working from outdated information here. The Radar I mentioned is something else; this one is <rdar://problem/28208090> Generated interface for import-as-member doesn't include context.

Jordan


> On Sep 27, 2017, at 11:45, Martin R via swift-users <swift-users at swift.org> wrote:
> 
> 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 at 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 at swift.org
>> https://lists.swift.org/mailman/listinfo/swift-users
> 
> _______________________________________________
> swift-users mailing list
> swift-users at swift.org
> https://lists.swift.org/mailman/listinfo/swift-users



More information about the swift-users mailing list