2017-06-20 19 views
6

Mam następujący kod w moim projekcie w Xcode 8.3.3 (Swift 3.1):Swift 4 kompatybilność wsteczną

let font = CGFont(provider!) 
CTFontManagerRegisterGraphicsFont(font, &error) 

Ale w Xcode 9 Beta (Swift 4), pojawia się następujący błąd:

Value of optional type 'CGFont?' not unwrapped; did you mean to use '!' or '?'?

Błąd polega na tym, że initializer for CGFont, który pobiera CGDataProvider, teraz zwraca opcjonalne.

Ale kiedy zastosować poprawkę z:

let font = CGFont(provider) 
CTFontManagerRegisterGraphicsFont(font!, &error) 

kod nie kompiluje w Xcode 8.3.3 z Swift 3.1 od czcionki nie jest opcjonalny, a zatem nie grać ładnie z !.

Czy istnieje sposób, aby to działało w obu wersjach Xcode? Czy Swift 4 ma być kompatybilny wstecz (kompilacja z kompilatorem Swift 3)?

+0

Powiedziałbym, że jest to przełomowa zmiana w Core Graphics (inicjator stał się awaryjny), więc nie ma to nic wspólnego z Swift 4. Ale myślę, że można użyć kompilacji warunkowej do obejścia tego problemu. –

Odpowiedz

4

skończyło się stosując następującą metodę, która pozwoliła na wstecznej kompatybilności bez kompilacji warunkowej (Idea pobranej od this blog post):

func optionalize<T>(_ x: T?) -> T? { 
    return x 
} 

ten sposób zarówno w Xcode 8 i 9 Xcode mogę użyć:

guard let font = optionalize(CGFont(provider)) else { 
    return 
} 
CTFontManagerRegisterGraphicsFont(font, &error) 
+1

To boli, aby to upomnieć, ale ja to robię. –

7

To przełomowa zmiana w Core Graphics, nie w samym Swift. Interfejs API został zmieniony, inicjator jest teraz uszkodzony.

Zastosowanie conditional compilation aby Twój kod skompilować zarówno 3.1 i 4.0 kompilatora:

#if swift(>=4.0) 
let font = CGFont(provider!) 
#else 
let font = CGFont(provider)! 
#endif 

CTFontManagerRegisterGraphicsFont(font, &error) 
+0

Jeśli używam tego, to zauważyłem, że nawet w Xcode 9 uderzałem w przypadek "jeszcze". Poszedłem więc do ustawień mojego projektu i zmieniłem "Swift Language Version" na Swift 4.0. Ale teraz znowu, jeśli otworzę w Xcode 8, to narzeka na nieobsługiwaną, szybką wersję ... –

+0

@AdamJohns Być może problem polega na tym, że nowy kompilator jest nadal w wersji beta, więc może mieć wersję taką jak 4.0.beta ... Spróbuj zmiana wersji w instrukcji kompilacji warunkowej na 3.3 (lub inną nieistniejącą wersję 3.x). Aby uniknąć zgadywania, uruchom 'swiftc --version' jako jeden ze skryptów fazy kompilacji, aby zobaczyć dokładną wersję kompilatora Swift w Xcode 9 i 8.3. Być może Xcode 9 używa starszej wersji narzędzi wiersza poleceń (sprawdź zakładkę Lokalizacje w ustawieniach Xcode). –

Powiązane problemy