2016-08-30 5 views
2

Ich arbeite an einer Bibliothek geschrieben in Objective-C und ich würde es gerne als "Swifty" wie möglich machen, wenn auf Swift überbrückt.Ist NS_SWIFT_NAME für Factory-Methoden reserviert?

Zum Beispiel kann eine Objective-C-Methode mit dieser Definition

-(void)logProductWithId:(NSString *) productId productName:(NSString*) productName; 

wird automatisch auf diese Swift-Funktion übersetzt

func logProductWithId(productId: String, productName: String) 

Ist es eine gute Angewohnheit, die NS_SWIFT_NAME Makro zu verwenden, um loszuwerden, das "mit":

-(void)logProductWithId:(NSString *) productId productName:(NSString*) productName NS_SWIFT_NAME(logProduct(identifier:name:)) 

was dann in swi übersetzt wird ft

func logProduct(identifier productId: String, name productName: String) 

Ich sehe einige SO questions zu erwähnen, dass NS_SWIFT_NAME nur für Fabrikmethoden zur Verfügung. Die Apple documentation erwähnt nur Factory-Methoden als Beispiel, aber nicht explizit, dass über eine Beschränkung auf NS_SWIFT_NAME

Antwort

1

Es gibt keine klare Einschränkung in Apples Dokumentation, soweit ich finden kann. Lass es uns versuchen.

Ein Beispielprojekt mit diesem Code:

#import <Foundation/Foundation.h> 

@interface MyClass : NSObject 
-(void)logProductWithId:(NSString *) productId productName:(NSString*) productName NS_SWIFT_NAME(logProduct(identifier:name:)); 

@end 

Compiliert erfolgreich, und Sie können die generierte Schnittstelle wie sehen:

import Foundation 

open class MyClass : NSObject { 

    open func logProduct(identifier productId: String!, name productName: String!) 
} 

Kein Problem. Vielleicht brauchen Sie eine andere Bedingung, um zu bekommen "Nur Factory-Methoden können 'swift_name' Attribut" Fehler haben, die ich noch nicht aufgedeckt habe.

Scheint NS_SWIFT_NAME ist nicht nur für Factory-Methoden reserviert. Und besser nutzen Sie es, um Ihren Objective-C-Code schneller zu machen. Und vergessen Sie bitte nicht, Attribute für die Nullwertigkeit zu setzen.

+0

Ja, ich habe die NULL-Attribute. Ich habe gerade versucht, auf XCode 6 zu kompilieren, wo das Makro überhaupt nicht definiert ist, also fügte ich eine Kompatibilität hinzu, wo ich es als '#define NS_SWIFT_NAME (_)' definierte – Jan

Verwandte Themen