2016-08-06 3 views
1

여러 프로젝트에서 사용하는 스위프트 프레임 워크을 만들었습니다. 내가 사용하고자하는 Objectivce-C 클래스는 곧바로 Swift로 포팅하기가 어렵습니다. 이 클래스는 SFTestSwift 프레임 워크 라이브러리에서 Objective-C 클래스를 사용할 수 있습니까?

@interface SFTest { 
} 
+ (NString *)myMethod(NSString *data); 
@end 
@implementation SFTest 
+ (NString *)myMethod(NSString *data) { 
    // does some processing 
    return processedData; 
} 
@end 

라고하자 어떻게 든하고, 만약 그렇다면, 어떻게 내 스위프트 프레임 워크 프로젝트에서이를 사용할 수 있습니까? 이것에 대한 나의 연구는 브리징 헤더라고 불리는 것을 언급하지만 스위프트 프레임 워크에서는 사용할 수 없다. 당신의 신속한 프로젝트

+0

내가 스위프트에 사용할 CommonCrypto을 가져올 그나마 : 그 호기심에 대한

이는 오브젝티브 C MyClass에 대한 구현 코드이었다. 난 단지 Swift Framework에서 Objective-C 클래스를 사용하고 싶다. 코드에서 공통 암호를 제거하고 간단한 예제를 사용할 수 있습니다. – kailoon

+0

CommonCrypto에 대한 언급이 삭제되었으므로 예 또는 아니오로 대답하는 것이 훨씬 쉬워졌습니다. – kailoon

답변

12

에 그 클래스를 사용할 수있는 파일에 헤더 파일을 브리징 만들어야합니다 마침내 내 장치에서 뭔가를 실행했습니다. 여기에 내 설정입니다. swiftlib라는 Swift Framework를 만들었습니다. "MyClass"라는 Objective-C 클래스를 추가했습니다. 기본적으로는 다음과 같습니다

enter image description here

은 그때 나의 새로운 목표 - C 클래스를 가져 오기 위해 "우산 헤더"를 수정했습니다. 우산 머리글은 신속한 라이브러리 프로젝트의 이름입니다. 그래서 제 경우에는 "swiftlib.h"였습니다. 내 우산 헤더 파일에있는 내용은 다음과 같습니다.

헤더 클래스를 public으로 설정하면 컴파일 오류가 발생합니다. 기본적으로 우산 헤더에 포함 된 것은 무엇이든 신속한 프레임 워크 사용자에게 공개되므로 공개해야합니다. 에서 MyClass.h을 선택하고 오른쪽 세부 줄을 열고 여기에 드롭 다운을 선택

enter image description here

내가 다음 테스트에 대한 단일 뷰 응용 프로그램에서이 스위프트 프레임 워크를 사용하고, 내 목표 - C 클래스를 사용 할 수 있었다 AppDelegate.swift과 같이 :

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
     // Override point for customization after application launch. 
     let test = MyClass.myMethod() 
     print("test = " + String(test)) 
     return true 
    } 

이 컴파일하고 내 장치에서 실행.

#import "MyClass.h" 
#import <CommonCrypto/CommonCrypto.h> 

@implementation MyClass 

+ (NSString *)myMethod { 
    NSString *key = @"test"; 
    NSString *data = @"mytestdata"; 
    const char *ckey = [key cStringUsingEncoding:NSASCIIStringEncoding]; 
    const char *cdata = [data cStringUsingEncoding:NSASCIIStringEncoding]; 
    unsigned char chmac[CC_SHA256_DIGEST_LENGTH]; 
    CCHmac(kCCHmacAlgSHA256, ckey, strlen(ckey), cdata, strlen(cdata), chmac); 
    NSData *hmac = [[NSData alloc] initWithBytes:chmac length:sizeof(chmac)]; 
    NSString *hash = [hmac base64Encoding]; 
    return hash; 
} 

@end 
+1

당신은 내 하루를 지켰습니다^_^ –

+0

몇 시간 동안 제 머리카락을 꺼내 ​​왔습니다. 이 상세한 솔루션을 가져 주셔서 감사합니다! – oriyentel

-4

먼저 사용 목적 C 클래스는 그래서이 걸 렸어요하지만 난 당신이 목표 C 클래스를 가져와야 한 다음 신속

+2

Swift Framework에서 브리징 헤더를 사용할 수 없습니다. – kailoon

관련 문제