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

Marco Masser lists at duckcode.com
Thu Sep 28 04:21:10 CDT 2017


Oh, nice, thank you Martin! It absolutely makes sense that the type does not have to be specified in the NS_SWIFT_NAME macro since that should be clear from the declaration itself. I didn’t think about that. Still, it seems like a little bit more magic than usual that the global scope Objective-C constant moves to the Swift type without the user explicitly stating that. But again, it does make sense.

Also, while trying out different ways to spell this out, it didn’t exactly help that the generated interface doesn’t include the context. Glad to see that this issue is already tracked by Apple. Thanks for your comments on that, Jordan.

Cheers,

Marco


> On 2017-09-27, at 21:38, Jordan Rose <jordan_rose at apple.com> wrote:
> 
> 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