programing

프리프로세서 매크로가 없는 경우 Xcode 프로젝트에서 프로젝트 수준에서 실용적인 스킴 고유의 플래그를 정의하는 방법이 있습니까?

yellowcard 2023. 4. 20. 20:44
반응형

프리프로세서 매크로가 없는 경우 Xcode 프로젝트에서 프로젝트 수준에서 실용적인 스킴 고유의 플래그를 정의하는 방법이 있습니까?

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

이러한 유형의 설정 게이트는 매크로가 지원되지 않기 때문에 swift를 사용하는 것이 쉽지 않은 것 같습니다.누가 비슷한 접근법을 제안할 수 있을까요? 코드가 컴파일 되어도 상관없습니다.하지만 빌드 스킴에 따라 피쳐를 게이트하고 싶습니다.

Swift 에서는, Apple 문서와 같이, 「#if/#else/#endif」프리프로세서 매크로를 사용할 수 있습니다(단, 제약이 있습니다).다음은 예를 제시하겠습니다.

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

단, "DEBUG" 기호를 다른 곳에 설정해야 합니다."Swift Compiler - Custom Flags" 섹션의 "Other Swift Flags" 행에서 설정합니다.DEBUG 기호를 추가할 때는-D DEBUG엔트리를 입력합니다.

(빌드 설정 -> Swift 컴파일러 - 커스텀 플래그)여기에 이미지 설명 입력

통상대로 [Debug]또는 [Release]에서 다른 값을 설정할 수 있습니다.

실제 코드로 테스트해 봤는데 놀이터에서는 인식이 안 되는 것 같아요.

스위프트 컴파일러 플래그를 설정하고 다른 타겟에 대해 최신 상태로 유지할 필요가 없었기 때문에 플래그를 설정하지 않는 문제에 직면했습니다.또, 혼재 코드 베이스에서는, 언어 마다 적절한 플래그를 항상 설정하는 것을 기억하고 싶지 않았습니다.

우리는 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 DEBUGOther Swift FlagsSwift Compiler - Custom Flags섹션을 참조하십시오.

다음으로 글로벌 범위에서 다음 메서드를 선언합니다.

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

이제 그것을 로서

if isDebugMode {
    // Do debug stuff
}

저는 "Active Compilation Condition" 디버깅 항목을 "DEBUG"로 설정했습니다.

다음으로 DEBGU 키를 사용하면 #IF DEBUG가 디버깅모드로 동작하고 #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
    

Swift 컴파일러 명령어

다음 컴파일러 디렉티브를 사용할 수 있습니다.

#if <some_key>
    //logic 1
#else
    //logic 2
#endif
//pre Xcode v8
Other Swift Flags(OTHER_SWIFT_FLAGS) = -D <some_key>
-D DEBUG

//from Xcode v8
Active Compilation Conditions(SWIFT_ACTIVE_COMPILATION_CONDITIONS) = <some_key>
DEBUG

obj-c 코드가 매크로를 사용하여 콘솔에 디버깅메시지를 보내는 혼합 언어 코드 베이스에서 작업하고 있습니다(이 매크로는 debug preprocessor 플래그를 사용합니다).난 그 매크로를 스위프트 코드로 부를 수 있기를 바랐어...

  1. 저는 obj-c 클래스 중 하나에 해당 매크로를 둘러싼 래퍼인 클래스 메서드를 만들었습니다.
  2. 그 obj-c 헤더를 브리지 헤더 파일에 추가했습니다.
  3. 이 클래스 메서드를 obj-c 매크로의 "프록시"라고 부릅니다.

매크로를 swift 코드로 바로 호출할 수 없는 것은 조금 짜증나지만, 디버깅 플래그를 켜거나 끄는 것에 대해 걱정할 수 있는 곳은 프로젝트에 하나밖에 없습니다.

언급URL : https://stackoverflow.com/questions/24111854/in-absence-of-preprocessor-macros-is-there-a-way-to-define-practical-scheme-spe

반응형