2017-09-24 10 views
10

현재 장치의 iOS 버전이 특정 버전 (지정된 here) 이하인 경우에만 코드를 실행하고 싶습니다. 애플이 주어진 코드 예제는 다음과 같다 :Objective-C의 @available 키워드를 부정한

if (@available(iOS 10.0, *)) { 
    // iOS 10.0 and above 
} else { 
    // below 10.0 
} 

그러나, 하나는 현재 iOS 버전이 특정 버전의 아래에있는 경우에만 코드를 실행하려는 시나리오가 있습니다. 나는 다음과 같은 코드가 작동합니다 가정 :

if ([email protected](iOS 10.0, *)) { 
    // below 10.0 
} 

그것이 작동하지 않는 것 같습니다 그러나, 나는 엑스 코드에서 다음과 같은 경고를 받고 있어요 :

@available does not guard availability here; use if (@available) instead 

Here를 LLVM가 추가 투입된다 진단 중이 야.

  1. if 블록 (매우 우아하지 않음)에 코드를 추가하지 않고 if-else 변형을 사용

    그 문제에 대한 두 가지 폴백 (fallback)가 있습니다.

  2. -[NSProcessInfo isOperatingSystemAtLeastVersion:]과 같은 이전 접근 방식을 계속 사용하십시오.

@available을 사용하려는 또 다른 방법이 있습니까?

+1

나는 LLVM 기사를 읽었으며 if의 다른 조건이나 명령에'@ available '을 사용할 수 없다고 나와 있습니다. 그래서 기본적으로 생각할 수있는 유일한 방법은 비어있는'if' 본문을 가지고 있지만'else' 블럭 내에서 액션을 수행하는 것입니다. 이것은 나에게 유일한 방법으로 보인다. – cramopy

+0

"그러나 이것이 작동하지 않는 것처럼 보입니다. Xcode에서 다음과 같은 경고가 나타납니다."경고가 있다고해서 작동하지 않는다는 의미는 아닙니다. 이 경고는 가용성을 보장하지는 않지만 단순히 버전 확인으로 사용하고 있으며 가용성을 보장하지는 않는다고 말합니다. – user102008

답변

0

응용 프로그램 전체에서 사용할 수있는 사용자 지정 매크로를 정의 할 수 있습니다. 예 : -

#define isIOS11() ([[UIDevice currentDevice].systemVersion doubleValue]>= 11.0 && [[UIDevice currentDevice].systemVersion doubleValue] < 12.0) 

또는

#define SinceIOS9_2 ([[UIDevice currentDevice].systemVersion doubleValue]>= 4.2 && [[UIDevice currentDevice].systemVersion doubleValue] < 9.2) 

아래처럼 사용 -

if (isIOS11()) { 
    // Do something for iOS 11 
} else { 
    // Do something iOS Versions below 11.0 
} 

이 당신을 위해 작동하는지 알려 주시기 바랍니다.

+0

이것은 깔끔합니다. 언젠가 그걸 시도 할 것 같아. 감사! – Akaino

+0

Xcode 9의 새로운 "Unguarded Availability"경고를 억제하지 않습니다. – StatusReport