2014-12-28 2 views
1

Swift에서 C++ 코드를 사용하려고합니다. 언어 간 유형 변환에 대한 도움이 필요합니다. 주로 C++ 데이터 구조를 신속하게 이해할 수있는 형식으로 변환하는 코드 예제를 고맙게 생각합니다.C++ 데이터 구조에서 Swift로 변환 유형

예를 들어 나는 다음과 같은 방법을 C++ 파일에 가지고 있습니다.

struct IntPoint { 
    cInt X; 
    cInt Y; 
}; 

typedef std::vector<IntPoint> Path; 

void MinkowskiSum(const Path& pattern, const Path& path, Paths& solution, bool pathIsClosed) 
{ 
    Minkowski(pattern, path, solution, true, pathIsClosed); 
    Clipper c; 
    c.AddPaths(solution, ptSubject, true); 
    c.Execute(ctUnion, solution, pftNonZero, pftNonZero); 
} 

와 나는 헤더 파일에 다음과 같은 한 :

#ifdef __cplusplus 
extern "C" { 
#endif 

    void MinkowskiSum(const Path& pattern, const Path& path, Paths& solution, bool pathIsClosed); 

#ifdef __cplusplus 
} 
#endif 

와 스위프트 이해하고 "무효 MinkowskiSum (CONST 경로를 볼 수 있도록 내가 브리징 - header.h가 - 파일이 & 패턴, const 경로 & 경로, 경로 & 솔루션, bool pathIsClosed); " 방법.

그리고 Swift와 C++은 int와 같은 원시 데이터 구조를 사용하는 한 완벽하게 통신합니다. 그러나 Path와 같은 사용자 지정 구조를 사용하려고합니다 (위에서 설명한대로). Swift 로의 C++ Path 변환에 대한 코드 예제를 매우 고맙게 생각합니다.

답변

2

C++ STL 컨테이너를 Swift에 쉽게 전달할 수 없습니다. 마찬가지로 그것은 Using Swift with Cocoa and Objective-C 책에서 말합니다 :

Swift에 C++ 코드를 직접 가져올 수 없습니다. 대신 C++ 코드 용 Objective-C 또는 C 래퍼를 만듭니다.

너무 나쁘지 않습니다. 스위프트 배열은 입력 데이터를 작성하는 STL 벡터와 매우 흡사합니다.

void f(const IntPoint* x); 

스위프트가된다 :

func f(x: UnsafePointer<IntPoint>) 

// callable as: 
f(path) 

void g(IntPoint* x); 

스위프트가된다

struct IntPoint { 
    let x: CInt 
    let y: CInt 
} 

var path = [IntPoint(x: 0, y: 0)] 
path.append(IntPoint(x: 1, y: 1)) 

그렇다면 당신은 C 함수에 해당 path 어레이를 통과 할 수있다 :당신은 또한 요소가 배열에 대한 포인터의 행동이 마음에 너무, 하지만 곰을 계산 통과해야 배열을 전달하는 경우 이후
func g(x: UnsafeMutablePointer<IntPoint>) 

// callable as: 
g(&path) 

이 (10)은 벡터 또는 스위프트 배열을 전달만큼 좋은하지 않을 수도 있습니다 C++ STL 반복자와 비슷합니다.

이 STL 알고리즘 스타일로 작성되어 일반 컨테이너로 시작 및 끝 반복자를 가져 오는 경우 C 브리지 함수에서 포인터와 카운트를 시작 및 끝 반복자로 쉽게 변환 할 수 있습니다. 그런 다음 C++ 알고리즘을 호출하십시오.

+0

Swift 파일에 IntPoint 및 Path를 구축했습니다. 나는 그 Swift 파일을 #include 참조와 함께 헤더 파일 (위 내용 참조)에 포함하려고합니다. 그러나 Xcode는 계속 오류를 발견하지 못합니다. 제가 누락 된 부분을 짐작할 수 있습니까? 제품 모듈 이름을 설정하고 모듈을 YES로 정의합니다. – user3673836