Swift와 C++를 혼합할 수 있나요?Objective-C .mm 파일처럼
방금 .m 파일을 .mm로 변경하여 C++를 사용하고 있습니다.Swift도 같은 방법으로 할 수 있나요?
은 단순히 를 ""에서 할 수 ..m로로 합니다..mm이 는 이 문제가 ..mm을 .cpp..h"never"는 로 "never"가 는 안 C++머리글
같은 프로젝트: 네.
같은 프로젝트에서 C, C++, Objective-C, Objective C++, Swift, 심지어 Assembly까지 자유롭게 혼합할 수 있습니다.
...Bridging-Header.h: 이 브릿지를 사용하여 C, Objective-C 및 Objective-C++를 Swift에 노출합니다.<ProductModuleName>-Swift.h: Swift 클래스가 자동으로 표시됩니다.@objc목적(C)으로.h: C의 모든 플레이버, ++의 사용 여부, 목적의 유무에 모호하게 사용되고 있기 때문에, 이것이 어려운 부분입니다.어떤 경우.hC++ 키워드는 1개도 포함되어 있지 않습니다.class, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ....Bridging-Header.h.cor or or openicle..cpp기능성을 선언합니다.그 이외의 경우 헤더는 순수 C API 또는 Objective-C API로 랩해야 합니다.
같은 파일: 아니요.
같은 파일에서 5개를 모두 혼합할 수 없습니다.동일한 소스 파일:
.swift: Swift를 어떤 것과도 혼재시킬 수 없습니다..m: Objective-C와 C를 혼합할 수 있습니다.(@Vinzz).mm: Objective-C와 C++를 혼재시킬 수 있습니다.이 브릿지는 Objective-C++입니다(@Vinzz)..c: 순수 C.cpp: C++와 어셈블리(@Vality)를 혼재시킬 수 있습니다..h: 유비쿼터스하고 애매한 C, C++, Objective-C 또는 Objective-C++. 따라서 답은 의존합니다.
레퍼런스
- C++에서 어셈블리 호출(Brett Hale)
- 목표-C에서 스위프트 호출(스비틀라나)
- Swift에서 C, C++, Obj-C, Obj-C++를 호출합니다(SwiftArchitect, self).
- iOS 9, Xcode 7 프로젝트 전체를 다운로드하려면 Swift Recipes에서 SO-32541268을 검색하십시오.
아니요. .m에서 .mm로 전환하면 Objective-C에서 Objective-C++라는 다른 언어(미묘한 차이가 많이 있음)로 전환됩니다.즉, 실제로는 C++를 사용하는 것이 아니라 대부분의 C++를 입력으로 받아들이는 Objective-C++를 사용합니다(C++가 입력으로 모든 C를 받아들이는 것과 동일).가 C++라는 하는 C을 생각해 .nil(C++) 목표-C++이다.
스위프트는 같은 관계를 가지고 있지 않다.나 C에 C++의 수 ..swiftfilename을 클릭합니다.
"Using Swift with Cocoa and Objective-C"는 또한 다음과 같은 사실을 알려줍니다.
C++ 코드를 Swift로 직접 Import할 수 없습니다.대신 C++ 코드용 Objective-C 또는 C 래퍼를 만듭니다.
C++, Objective C, Swift 코드를 혼합하는 방법을 보여주는 간단한 Xcode 6 프로젝트를 작성했습니다.
https://github.com/romitagl/shared/tree/master/C-ObjC-Swift/Performance_Console
특히 이 예에서는 Swift에서 목표 C 및 C++ 함수를 호출합니다.
중요한 것은 Project-Bridging-Header.h 공유 헤더를 생성하여 오브젝트 C 헤더를 배치하는 것입니다.
완전한 예로서 프로젝트를 다운로드해 주세요.
Objective-C 파일은 중간에 건너뛸 수도 있습니다.C 헤더 파일에 .cpp 소스 파일을 추가합니다.헤더 파일에는 C 선언만 있고 소스 파일에는 임의의 C++ 코드를 포함합니다.그런 다음 **-Bridging-Header.h에 C 헤더 파일을 포함합니다.
다음 예제에서는 C++ 객체(구조 Foo)로 포인터를 반환하여 Swift가 구조 Foo를 글로벌 공간에 정의하는 대신 COpaque Pointer에 저장할 수 있도록 합니다.
Foo.h 파일(Swift에 의해 표시됨 - 브리징 파일에 포함됨)
#ifndef FOO_H
#define FOO_H
// Strictly C code here.
// 'struct Foo' is opaque (the compiler has no info about it except that
// it's a struct we store addresses (pointers) to it.
struct Foo* foo_create();
void foo_destroy(struct Foo* foo);
#endif
내부 소스 파일 Foo.cpp(Swift에서는 표시되지 않음):
extern "C"
{
#include "Foo.h"
}
#include <vector>
using namespace std;
// C++ code is fine here. Can add methods, constructors, destructors, C++ data members, etc.
struct Foo
{
vector<int> data;
};
struct Foo* foo_create()
{
return new Foo;
}
void foo_destroy(struct Foo* foo)
{
delete foo;
}
방금 Swift, Objective-C, C++를 사용하여 간단한 예시 프로젝트를 만들었습니다.iOS에서 OpenCV 스티치를 사용하는 방법에 대한 데모입니다.OpenCV API는 C++이기 때문에 Swift에서 직접 대화할 수 없습니다.구현 파일이 Objective-C++인 작은 래퍼 클래스를 사용합니다.Header 파일은 clean Objective-C이므로 Swift는 이 파일에 직접 대화할 수 있습니다.Swift와 대화하는 헤더에 C++-ish 파일을 간접적으로 Import하지 않도록 주의해야 합니다.
프로젝트는 이쪽입니다.https://github.com/foundry/OpenCVSwiftStitch
C++/swift하다스위프트에서 C++ 클래스를 인스톨 하거나, C++ 클래스에서 상속하거나, 가상 메서드를 스위프트로 덮어쓸 수도 있습니다.
C++는 Objective-C/Objective-C++입니다.
https://github.com/sandym/swiftpp
Swift는 C++와 직접 호환성이 없습니다.C++ 코드를 Objective-C로 래핑하고 Objective C 래퍼를 Swift로 사용하여 이 문제를 해결할 수 있습니다.
opencv를 빠르게 조합하는 데모 프로그램도 있습니다.
https://github.com/russj/swift_opencv3_demo 에서 다운로드 할 수 있습니다.
데모의 상세한 것에 대하여는, http://flopalm.com/opencv-with-swift/ 를 참조해 주세요.
아니, 한 파일로는 안 돼.
그러나 정적 라이브러리나 프레임워크 없이 Swift Projects에서 C++를 사용할 수 있습니다.다른 경우와 마찬가지로 중요한 것은 C로 마킹된 C++ 헤더를 #포함하는 Objective-C 브리징헤더를 외부 "C" {} 트릭과 호환되도록 하는 것입니다.
비디오 튜토리얼: https://www.youtube.com/watch?v=0x6JbiphNS4
다른 답변은 약간 부정확합니다.실제로 Swift와 [Objective-]C[+]를 같은 파일에 혼재시킬 수 있습니다.다만, 예상과는 달리,
이 파일(c.swift)은 다음 두 가지를 모두 사용하여 유효한 실행 파일로 컴파일됩니다.swiftc c.swift ★★★★★★★★★★★★★★★★★」clang -x objective-c c.swift
/* /* */
#if 0
// */
import Foundation
print("Hello from Swift!")
/* /* */
#endif
#include <stdio.h>
int main()
{
puts("Hello from C!");
return 0;
}
// */
요령 중 하나는 이다
브리징 obj-c++ 파일에는 별도의 헤더가 필요합니다.
@interface와 @implementation을 보통 사용하는 것과 같은 .mm 파일에 넣을 수는 없습니다.
브리징 헤더 파일에는
#import "Linkage.hpp"
링크hpp에는 Linking의 @interface가 있고 Linkage.mm에는 .mm의 @interface가 있습니다.
그리고 나서.
...Linked.hpp에는 실제로 #yourCpp.hpp는 포함되지 않습니다.
#include "yourCpp.hpp"링크 파일이 아닌 Linkage.mm 파일에 있습니다.hpp 파일
많은 온라인 예/튜토리얼에서 라이터는 @interface와 @implementation을 같은 .mm 파일에 넣기만 하면 됩니다.
이것은 매우 단순한 cpp 브리징 예에서는 동작합니다만,
문제는 다음과 같습니다.
사용할 수 있는 경우 첫 줄 Cpp.hpp c++).#include <something>이 경우 프로세스가 실패합니다.
하지만 만약 네가 이 모든 걸 다 가지고 있지 않다면#include "yourCpp.hpp"Linked 헤더 파일(.mm 파일도 괜찮고 당연히 필요하죠) - 동작합니다.
다시 말씀드리지만 안타깝게도 이것은 전체 프로세스에서 하나의 팁에 불과합니다.
이것이 누구에게나 도움이 될 수 있도록 간단한 C++ 정적 라이브러리를 Swift 명령줄 유틸리티에서 호출하는 방법에 대한 간단한 튜토리얼도 있습니다.이것은 개념 증명 코드입니다.
Objective-C는 관여하지 않고 Swift와 C++만 관여합니다.C++ 라이브러리의 코드는 외부 "C" 링크로 함수를 구현하는 C++ 래퍼에 의해 호출됩니다.이 함수는 다음으로 브리징헤더로 참조되어 Swift에서 호출됩니다.
http://www.swiftprogrammer.info/swift_call_cpp.html 를 참조해 주세요.
Swift Programming Language의 변경 및 사용자 가시성 향상을 위한 제안을 유지하는 것으로 설명된 공식 리소스에서 SE-0038에 대한 링크를 제공합니다.
오늘 현재 상태는 승인되었지만 아직 스케줄되지 않은 기능 요청입니다.
이 링크는 이 기능을 찾는 모든 사용자를 올바른 방향으로 유도하기 위한 것입니다.
언급URL : https://stackoverflow.com/questions/24042774/can-i-mix-swift-with-c-like-the-objective-c-mm-files
'programing' 카테고리의 다른 글
| 다음 코드에서의 sys.sp_addextended property 사용에 대해 설명해 주시겠습니까? (0) | 2023.04.14 |
|---|---|
| 숫자 숨김 값이 포함된 텍스트를 표시하는 Excel 드롭다운 목록을 만드는 방법 (0) | 2023.04.14 |
| xcode4의 프레임워크와 정적 라이브러리의 차이 및 호출 방법 (0) | 2023.04.14 |
| 날짜 시간 문자열을 Bash에서 에폭으로 변환 (0) | 2023.04.14 |
| C#에서 범용 목록을 복제하려면 어떻게 해야 하나요? (0) | 2023.04.14 |