2016-03-29 12 views
2

ich die Quittung Bestätigungscode in schnellen Schreiben, aber ich habe ein Problem mit einem PKCS7_type_is_signed Makro: Verwendung von ungelösten Bezeichner ‚PKCS7_type_is_signed‘Verwendung von ungelösten Bezeichner ‚PKCS7_type_is_signed‘

es irgendwelche Art und Weise, es zu benutzen in Swift außer dem Erstellen von Objective-C-Wrapper für diese Makros?

Wrapper sieht wie folgt aus:

#import "OpenSSLWrapper.h" 

#import "openssl/pkcs7.h" 
#import "openssl/objects.h" 

@implementation OpenSSLWrapper 

+ (BOOL)PKCS7TypeIsSigned:(PKCS7*)bio{ 
    return PKCS7_type_is_signed(bio); 
} 

@end 
+0

Warum schreiben Sie nicht einfach den Wrapper? – nhgrif

Antwort

1

aus Äpfeln Mit Swift mit Cocoa und Objective-C

Komplexe Makros werden in C und Objective-C verwendet, aber haben kein Gegenstück in Swift. Komplexe Makros sind Makros, die keine Konstanten definieren, einschließlich eingeklammerte, funktionsähnliche Makros. Sie verwenden komplexe Makros in C und Objective-C, um Einschränkungen bei der Typprüfung zu vermeiden oder zu vermeiden, große Mengen von Boilerplate-Code erneut zu tippen. Makros können jedoch Debugging und Refactoring schwierig machen. In Swift können Sie die Funktionen und Generics verwenden, um die gleichen Ergebnisse ohne Kompromisse zu erzielen. Daher werden die komplexen Makros, die sich in C- und Objective-C-Quelldateien befinden, Ihrem Swift-Code nicht zur Verfügung gestellt.

Und wie von nhgrif (danke :-)), zeigen 2 Optionen hier Wrapper oder einfach Makro erweitern.

Expand Macro:

# define PKCS7_type_is_signed(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_signed) 

func PKCS7_type_is_signed(pkcs:UnsafeMutablePointer<PKCS7>)->Bool{ 
    return OBJ_obj2nid(pkcs.memory.type) == NID_pkcs7_signed 
} 

func PKCS7_type_is_data(pkcs:UnsafeMutablePointer<PKCS7>)->Bool{ 
    return (OBJ_obj2nid(pkcs.memory.type) == NID_pkcs7_data) 
} 

Wrapper:

.h-Datei:

#import <Foundation/Foundation.h> 
#import "openssl/pkcs7.h" 
#import "openssl/objects.h" 

    @interface OpenSSLWrapper:NSObject 
    + (BOOL)PKCS7TypeIsSigned:(PKCS7*)bio; 
    + (BOOL)PKCS7TypeIsData:(PKCS7*)contents; 
    @end 

.m-Datei:

#import "OpenSSLWrapper.h" 

@implementation OpenSSLWrapper 

+ (BOOL)PKCS7TypeIsSigned:(PKCS7*)bio{ 
    return PKCS7_type_is_signed(bio); 
} 

+ (BOOL)PKCS7TypeIsData:(PKCS7*)contents{ 
    return PKCS7_type_is_data(contents); 
} 


@end 
2

Das Makro wird nicht in Swift arbeiten. Sie müssen einen Wrapper schreiben.

Swift kann keine Typinformationen von einem Makro unterscheiden. Welche Art von Argumenten sollte der Swift-Compiler in dieses Makro übergeben? Weil es nicht unterscheiden kann, wird es nicht kompiliert.

Es ist auch wahrscheinlich erwähnenswert, dass in C/Objective-C, diese Makros einfach zu finden sind, ersetzen Sie die 10. Das Makro wird vor der Kompilierung erweitert. Wenn dieses Makro erweitert wurde, würde es fast sicher in Code expandieren, der nicht in einer SWIFT-Datei kompiliert werden würde.

+0

Danke, Makros scheinen am Morgen so selbstverständlich zu sein - ich sollte wahrscheinlich bis Mitternacht aufhören zu arbeiten :-) – CryingHippo

Verwandte Themen