[ios] 전 처리기 매크로가 없으면 Xcode 프로젝트의 프로젝트 레벨에서 실제 체계 특정 플래그를 정의하는 방법이 있습니까?

신속하게 진행하기 전에 알파, 베타 및 배포 빌드에 대한 체계를 정의했습니다. 이러한 각 구성표에는 프로젝트 수준에서 특정 동작을 게이트하도록 정의 된 매크로 세트가 있습니다. 가장 간단한 예는 실행 빌드에 대한 기본 체계에서 모든 Xcode 프로젝트에 대해 기본적으로 정의 된 DEBUG = 1 매크로입니다. #ifdef DEBUG …를 쿼리하고 그에 따라 코드에서 결정을 내릴 수 있으며 불필요한 코드를 컴파일 할 수도 있습니다.

이러한 유형의 구성 게이팅은 매크로가 지원되지 않기 때문에 신속한 사용이 쉽지 않습니다. 누군가 비슷한 접근법을 제안 할 수 있습니까? 코드가 컴파일되어 있는지는 신경 쓰지 않습니다. 그래도 빌드 체계를 기반으로 기능을 게이트하고 싶습니다.



답변

Swift에서는 Apple 문서에 따라 여전히 “# if / # else / # endif”전 처리기 매크로를 사용할 수 있습니다 (더 제한적 임) . 예를 들면 다음과 같습니다.

#if DEBUG
    let a = 2
#else
    let a = 3
#endif

이제 “DEBUG”기호를 다른 곳에 설정해야합니다. “Swift Compiler-Custom Flags”섹션, “Other Swift Flags”라인에서 설정하십시오. -D DEBUG항목 과 함께 DEBUG 기호를 추가합니다 .

(빌드 설정-> 스위프트 컴파일러-사용자 정의 플래그)
여기에 이미지 설명을 입력하십시오

일반적으로 디버그 또는 릴리스시 다른 값을 설정할 수 있습니다.

실제 코드로 테스트했습니다. 놀이터에서 인식되지 않는 것 같습니다.


답변

우리는 신속한 컴파일러 플래그를 설정하고 싶지 않다는 문제를 겪었습니다. 왜냐하면 우리는 플래그를 설정하고 다른 대상 등을 위해 최신 상태로 유지하고 싶지 않기 때문입니다. 또한 혼합 코드베이스에서 우리는 기억하고 싶지 않았습니다. 각 언어에 대해 항상 플래그를 적절하게 설정합니다.

우리는 ObjC에서 파일을 선언했습니다.

PreProcessorMacros.h

extern BOOL const DEBUG_BUILD;

.m에서

PreProcessorMacros.m

#ifdef DEBUG
    BOOL const DEBUG_BUILD = YES;
#else
    BOOL const DEBUG_BUILD = NO;
#endif

그런 다음 Objective-C 브리지 헤더에서

#import "PreProcessorMacros.h"

이제 Swift 코드베이스에서 이것을 사용하십시오.

if DEBUG_BUILD {
    println("debug")
} else {
    println("release")
}

이것은 확실히 해결 방법이지만 문제를 해결하여 도움이되기를 희망하여 여기에 게시했습니다. 기존 답변이 유효하지 않다고 제안하는 것은 아닙니다.


답변

Logans 방법에 대한보다 신속한 솔루션. 설정 -D DEBUG에서 Other Swift FlagsSwift Compiler - Custom Flags대상의 빌드 설정 섹션을 참조하십시오.

그런 다음 전역 범위에서 다음 메소드를 선언하십시오.

#if DEBUG
let isDebugMode = true
#else
let isDebugMode = false
#endif

이제 다음과 같이 사용하십시오.

if isDebugMode {
    // Do debug stuff
}


답변

나를 위해 ” Active Compilation Condition ” 의 디버그 항목 을 “DEBUG”로 설정했습니다.

그런 다음 #IF에서 DEBGU 키 작업을 사용하면 디버그 모드에서 작동하고 #ELSE는 릴리스 모드에서 작동합니다.

  1. 대상을 선택하십시오
  2. 빌드 설정 탭에서 “활성 컴파일 조건”을 검색하십시오.
  3. “Debug”항목의 값을 “YourKeyWord”로 설정하십시오.
  4. 다음과 같이 간단하게 사용하십시오.

    #if DEBUG
        print("You'r running in DEBUG mode!")
    #else
        print("You'r running in RELEASE mode!")
    #endif

답변

obj-c 코드가 매크로를 사용하여 디버그 메시지를 콘솔에 보내는 혼합 언어 코드베이스에서 작업하고 있습니다 (그리고 그 매크로는 디버그 전 처리기 플래그에 의존합니다). 신속한 코드에서 동일한 매크로를 호출 할 수 있기를 원했습니다 …

  1. 매크로 주위의 래퍼 인 obj-c 클래스 중 하나에 클래스 메서드를 만들었습니다.
  2. obj-c 헤더를 브리지 헤더 파일에 추가했습니다.
  3. 이제 내 빠른 코드는 해당 클래스 메서드를 obj-c 매크로에 대한 “프록시”로 호출합니다.

스위프트 코드에서 매크로를 바로 호출 할 수 없다는 것은 약간 성가시다. 그러나 적어도 지금은 프로젝트에서 디버그 플래그를 켜고 끄는 것에 대해 걱정할 곳이 한 곳 밖에 없다.


답변