2017-06-07 56 views
16

chcę użyć Xcode 9 dodać kod iOS 11 do mojego projektu, zachowując możliwość skompilować projekt z Xcode 8, która obsługuje tylko iOS 10.Co to jest odpowiednik Swift obiektu Objective-C "#ifdef __IPHONE_11_0"?

w Objective-C, można to zrobić za pomocą dyrektywy preprocesora sprawdzić, czy zdefiniowano __IPHONE_11_0. Który ukryje kod jakbym kompilacji z SDK podstawie wcześniej niż iOS 11. tak:

#ifdef __IPHONE_11_0 
    if (@available(iOS 11.0, *)) { 
     self.navigationController.navigationBar.prefersLargeTitles = YES; 
    } 
#endif 

Czy istnieje sposób, aby to zrobić w Swift?

if #available(iOS 11.0, *) nie działa, ponieważ jest to sprawdzanie w czasie wykonywania.

Odpowiedz

13

IOS 11 SDK wyposażony Swift 3.2 (lub Swift 4), dzięki czemu można korzystać z szybkiego sprawdzania wersji, aby osiągnąć to samo:

#if swift(>=3.2) 
    if #available(iOS 11.0, *) { 
     … 
    } 
#endif 
+0

Jak to może być wykorzystane w projekcie obj-C? Błąd kompilatora to "Makrooperacyjne makro" swift "nie jest zdefiniowane"? Dzięki – Jerome

+0

@Jerome Nie można. –

5

Jest to rozwiązanie sugerowane przez Apple:

if #available(iOS 11.0, *) { 
    // iOS 11 specific stuff here 
} else { 
    // non iOS 11 stuff here 
} 

Proszę odnieść się do this resources (oglądania wideo na znak 6:50 po więcej szczegółów)

+2

Dotyczy to metody wewnętrznej. Myślę, że operacja próbuje dowiedzieć się, co zrobić w przypadku metod opartych na systemie iOS 11 lub nowszym. – SAHM