2015-01-06 6 views
4

목표 C에서 코드에 사용 된 컴파일 플래그 집합을 inbuild Setting -> Other C Flags으로 설정했습니다. 예를 들어 :Swift - 컴파일 변수 사용?

깃발 =>

그리고 코드에서 나는이 스위프트 작동하지 않습니다, 나는 대답을 찾을 수 아니에요 @PortNumber

하여 액세스 할 수 있었다 -DPortNumber = 1. 아무 생각하세요?

답변

10

-D C 컴파일러 플래그는 전 처리기 매크로를 정의합니다. Swift에는 사전 처리기 매크로가 없습니다. 따라서 다음과 같이하려고한다면 :

// compile with -DPORT_NUMBER 31337 
var port = PORT_NUMBER // error 

... 할 수 없습니다. Swift는 소스 코드가 컴파일되기 전에 구문 적으로 완성되도록 설계되었습니다. 빌드 할 때 블록을 전환 할 수 있다면 코드가 올바른지 확인하는 데 도움이되는 툴체인의 기능을 깨뜨릴 수 있습니다. (C의 전 처리기 매크로는 텍스트 대체가 가능하기 때문에 변수의 값을 채우는 것뿐만 아니라 언어의 일부를 다시 쓸 수 있습니다.)

Swift 컴파일러에는 -D 플래그가 있지만 사용법은 더 제한적이므로 build configurations에만 사용할 수 있습니다. 당신은 다음과 같은 것을하고 싶어한다면, 당신은 멋진 것 :

// compile with -DUSE_STAGING_SERVER 
#if USE_STAGING_SERVER 
var port = 31337 
#else 
var port = 80 
#endif 

참고 C는 달리 #if 블록 내부의 모든 구문 완성 될 필요가있다. (예를 들어, 블록에 func의 선언 행을 넣고 함수 본문을 조건부 외부에 둘 수는 없습니다.)

물론 구성을 원할 경우 도움이되지 않습니다. 을 컴파일 타임에 설정하여 코드에 사용하십시오. 이를 위해서는 대체 접근법을 권하고 싶습니다. Xcode는 속성 목록과 같은 리소스 파일에서 여전히 텍스트 대체를 수행 할 수 있습니다. (예를 들어, 앱과 함께 제공되는 Info.plist에는 $(TARGET_NAME) 등이 가득합니다.) 따라서 프로젝트 설정에 따라 컴파일 타임에 내용이 채워지는 패키지 리소스를 앱에 포함시킬 수 있습니다. 포트 번호.

관련 문제