2016-07-23 8 views
2

관련 질문이 있지만 기존 스레드에 대한 논평이 사이트 명성이 부족하여 새 스레드를 시작해야합니다. 미안합니다.Swift 3에서 조건부 컴파일을 수행하는 방법은 무엇입니까?

Swift에는 전처리 기가 없습니다. #if/#else/#endif를 사용하여 해결할 수 있지만 문제는 컴파일러에서 'false'부분을 숨기지 않아서 'true'와 'false'부분 모두 구문 적으로 유효해야한다는 것입니다. Swift 3이 Swift 2와 구문 적으로 호환되지 않기 때문에 어렵습니다. 어느 환경에서 컴파일 할 수있는 코드를 만들 수있는 해결 방법을 찾은 사람이 있습니까? XCode 8 베타가 Swift 2.2를 허용하거나 XCode 7.3.1이 Swift 3을 허용 한 경우 여기에서 해결 방법이 제공됩니다. 난 그냥 하나의 사소한 예를 제공하기 위해, 할 노력하고있어 무엇

, 나는이 작업을 수행 할 수있는 방법을 찾을 수 없습니다

#if SWIFT3  
    let session = WCSession.default() 
#else 
    let session = WCSession.defaultSession() 
#end 

같은이며,이없는 것은 놀라운 것 Swift3 구문이 Swift2와 얼마나 완벽하게 호환되지 않는지를 고려해보십시오.

+0

스위프트 3 구문은 실제로 스위프트 2와 매우 다릅니다.'# if'를 사용하여 페이퍼를 작성하려고하는 것은 전처리기를 사용하더라도 작동하지 않습니다. 의도 된 솔루션은 코드베이스를 Swift 3으로 변환 (또는 Swift 3으로 포크)하는 것입니다. 두 가지 모두를 컴파일하는 중요한 코드 기반을 유지하려고 시도하는 것은 막 다른 길입니다 (Swift 1과 Swift 2와 마찬가지입니다). –

+0

@RobNapier 나는 그것에 동의 할 수 없다. 그것은 도덕적으로 바람직하지 않을 수도 있지만, 정확히 이러한 목적을 위해 조건부 컴파일을 제공하고 작동합니다. 스위프트 3 로의 전환이 단편적으로 진행되어야하는 상황을 상상할 수 있습니다. – matt

+0

@matt 그 게임을 보는 것이 흥미로울 것이지만, 1에서 2로가는 것은 사소한 코드 기반에서는 실용적이지 않습니다. 2 ~ 3은 여러 가지 이름을 변경하기 때문에 훨씬 더 큰 변화입니다. 매우 작은 코드 조각 이상으로 작동한다고 상상하기는 어렵습니다. 그러나 시간은 말할 것이다. –

답변

7
나는 그럼에도 불구하고이

을 할 수있는 방법을 찾을 수 없습니다

가 존재 하나이며,이 스위프트 2.2 이후 하나가되었습니다; 그들은 바로이 사태에 대해 미리 계획 :

https://github.com/apple/swift-evolution/blob/master/proposals/0020-if-swift-version.md

그래서,이 같은 (나는 WCSession이 무엇인지 모르는, 그래서 다른 예를 사용) :

#if swift(>=3.0) 
     let screen = UIScreen.main() 
    #else 
     let screen = UIScreen.mainScreen() 
    #endif 

편집을 애플, 엑스 코드에 따르면 스위프트에 임의의 조건부 컴파일 플래그의 통과 8 개 허가 :

Active Compilation Conditions 새로운 빌드 정이다 Swift 컴파일러에 조건부 컴파일 플래그를 전달합니다. 이 설정 값의 각 요소는 Preprocessor Macros의 요소가 동일한 접두사를 사용하여 clang으로 전달되는 것과 동일한 방식으로 -D이 접두사 인 swiftc으로 전달됩니다. (22457329)

+0

고마워, 그게 효과가 있어요! –

관련 문제