Krótko mówiąc, podczas korzystania z Xcode 9 Beta napotkałem następujące ostrzeżenie:
Zastosowanie wnioskowania Swift 3 @objc w trybie Swift 4 jest przestarzałe. Proszę rozwiązać przestarzałe ostrzeżenia wnioskowania @objc, przetestować kod z włączonym rejestrowaniem „Używanie przestarzałego wnioskowania @objc” i wyłączyć wnioskowanie Swift 3 @objc. **
Po kilku badaniach wciąż nie mam pojęcia, jak rozwiązać problem. Byłbym bardzo wdzięczny za wszelkie wskazówki, jak rozwiązać ten problem, a także wyjaśnienie, co się dzieje.
Moim celem jest lepsze zrozumienie tego, co dzieje się z moim kodem.
swift
swift4
xcode9-beta
DaleK
źródło
źródło
Odpowiedzi:
Pozbyłem się tego ostrzeżenia, zmieniając ustawienie kompilacji „Swift 3 @objc Inference” moich celów na „Default”.
Z tego artykułu :
Więcej informacji można znaleźć w tej propozycji Swift .
źródło
@objc
wnioskowania Swift 3 w trybie Swift 4 jest przestarzałe. Proszę rozwiązać przestarzałe@objc
ostrzeżenia wnioskowania, przetestować kod z@objc
włączonym rejestrowaniem „ Używanie przestarzałego wnioskowania Swift 3 ” i wyłączyć@objc
wnioskowanie Swift 3 ”. Masz pomysł, gdzie włączyć wspomniane@objc
rejestrowanie wnioskowania Swift 3 ?- Co to jest
@objc
wnioskowanie? Co się dzieje?W
Swift 3
kompilator dokonuje wyboru@objc
w wielu miejscach, więc nie musisz tego robić. Innymi słowy, dodaje to@objc
dla Ciebie!W
Swift 4
kompilator już tego nie robi (tyle). Musisz teraz dodać@objc
wyraźnie.Domyślnie, jeśli masz projekt w wersji wcześniejszej niż Swift 4, otrzymasz ostrzeżenia o tym. W projekcie Swift 4 wystąpią błędy kompilacji. Jest to kontrolowane poprzez
SWIFT_SWIFT3_OBJC_INFERENCE
ustawienie kompilacji. W projekcie wcześniejszym niż Swift 4 jest to ustawione naOn
. Poleciłbym ustawić to naDefault
(lubOff
), co jest teraz domyślną opcją w nowym projekcie.Konwersja wszystkiego zajmie trochę czasu, ale ponieważ jest ona domyślna dla Swift 4, warto to zrobić.
- Jak zatrzymać ostrzeżenia / błędy kompilatora?
Istnieją dwa sposoby konwersji kodu, aby kompilator nie narzekał.
Jednym z nich jest użycie
@objc
każdej funkcji lub zmiennej, która musi być narażona na środowisko wykonawcze Objective-C:Drugim jest użycie
@objcMembers
przezClass
deklarację. Zapewnia to automatyczne dodawanie@objc
do WSZYSTKICH funkcji i zmiennych w klasie. Jest to prosty sposób, ale ma koszt, na przykład może zwiększyć rozmiar aplikacji, ujawniając funkcje, które nie musiały być ujawniane.- Co to jest
@objc
i dlaczego jest konieczne?Jeśli wprowadzisz nowe metody lub zmienne do klasy Swift, oznaczenie ich jako
@objc
narażające je na środowisko wykonawcze Objective-C. Jest to konieczne, gdy masz kod Objective-C, który korzysta z klasy Swift lub, jeśli używasz funkcji typu Objective-C, takich jakSelectors
. Na przykład wzorzec cel-działanie:button.addTarget(self, action:#selector(didPressButton), for:.touchUpInside)
- Dlaczego nie miałbym oznaczać wszystkiego
@objc
?Istnieją negatywy związane z oznaczeniem czegoś jako
@objc
:Proszę pamiętać, że jest to streszczenie na wysokim poziomie i że jest bardziej skomplikowane niż pisałem. Poleciłbym przeczytać aktualną propozycję, aby uzyskać więcej informacji.
Źródła:
źródło
@objc
nie oznacza dynamicznej wysyłki, Swift może swobodnie korzystać z wysyłki statycznej lub wirtualnej (i może w rezultacie wykonać inny kod). Słowodynamic
kluczowe jest wymagane, aby zmusić Swift do korzystania z dynamicznej wysyłki.@objc
deprecjonowane, czego musimy użyć?SWIFT_SWIFT3_OBJC_INFERENCE
oOn
. Konwertuj na Swift 4. Następnie rozwiąż problem@objc
. Aby to uprościć, postępuj zgodnie z podstawowymi zasadami: JEŚLI klasa Swift jest używana w kodzie Objc-C (poprzez nagłówek mostkujący)@objcMembers
, w przeciwnym razie użyj dodawania jeden po drugim@objc
. Wystarczy użyć wyszukiwania Xcode, aby dowiedzieć się, czy klasa Swift jest wywoływana z dowolnego.m
pliku. To powinno uczynić konwersję względnie bezbolesną.@objc
zmieniono Swift 4, a następnie podjąć decyzję o naprawieniu projektu i pozostawieniu go bez zmian .Migrator nie może zidentyfikować wszystkich funkcji, które wymagają @objc Wnioskowane argumenty C celu oznaczone jako przestarzałe, aby pomóc Ci je znaleźć
• Twórz ostrzeżenia o przestarzałych metodach
• Komunikaty konsoli podczas uruchamiania przestarzałych informacji
źródło
Miałem to ostrzeżenie z ustawieniem „Swift 3 @objc Inference” = „Default”. Potem zdałem sobie sprawę, że zostało to ustawione dla Projektu - nie dla celu. Upewnij się więc, że masz w ustawieniu „Domyślne” ustawienie, aby pozbyć się ostrzeżenia.
źródło
Możesz po prostu przejść do „default” zamiast „ON”. Wydaje się bardziej przywiązany do logiki Apple.
(ale wszystkie pozostałe komentarze dotyczące używania
@obj
pozostają aktualne).źródło
Rzeczywiście, pozbędziesz się tych ostrzeżeń, wyłączając Swift 3 @objc Inference. Jednak mogą pojawić się subtelne problemy. Na przykład KVO przestanie działać. Ten kod działał idealnie pod Swift 3:
Po migracji do Swift 4 i ustawieniu domyślnie „Swift 3 @objc Inference” niektóre funkcje mojego projektu przestały działać . Zajęło mi trochę debugowania i badań, aby znaleźć rozwiązanie tego problemu. Według mojej najlepszej wiedzy, oto opcje:
Ponowne włączenie wnioskowania @objc pozostawia ostrzeżenia, ale jest to najszybsze rozwiązanie. Pamiętaj, że jest dostępna tylko dla projektów migrowanych z wcześniejszej wersji Swift. Pozostałe dwie opcje są bardziej żmudne i wymagają trochę kopania kodu oraz obszernych testów.
Zobacz także https://github.com/apple/swift-evolution/blob/master/propozycje/0160-objc-inference.md
źródło
Od czasu do czasu jestem programistą iOS (wkrótce będzie więcej), ale nadal nie mogłem znaleźć ustawienia zgodnie z inną odpowiedzią (ponieważ nie miałem tego elementu pęku kluczy, który pokazuje odpowiedź), więc teraz, gdy go znalazłem, pomyślałem Mogę po prostu dodać tę migawkę z wyróżnionymi lokalizacjami, które trzeba będzie kliknąć i znaleźć.
źródło
Możesz spróbować wykonać „aktualizację kapsuły” i / lub „trzepotanie”
Ustawiłem również to ustawienie w xcode.
Ustawienie interfejsu Objective-C jest następujące:
źródło
Wnioskowanie Swift 3 @objc Wykorzystanie wnioskowania Swift 3 @objc w trybie Swift 4 jest przestarzałe. Proszę rozwiązać przestarzałe ostrzeżenia wnioskowania @objc, przetestować kod z włączonym rejestrowaniem „Używanie przestarzałego wnioskowania @objc”, a następnie wyłączyć wnioskowanie, zmieniając ustawienie kompilacji „Swift 3 @objc Wnioskowanie” na „Domyślne” dla „XMLParsingURL” cel.
dotarłem do
Pierwszy krok to ustawienie kompilacji
Wyszukaj w Wnioskowanie ustawień kompilacji
change swift 3 @objc Wnioskowanie Domyślne
wprowadź opis zdjęcia tutaj
źródło
Wystarczy uruchomić test, czekaj do końca, a następnie przejdź do Kompilacji ustawień, Szukaj w Konstruowaniu ustawień wnioskowania, zmień szybkie 3 @objc Wnioskowanie na (Domyślne). to wszystko, co zrobiłem i działało idealnie.
źródło
użyj func call @objc
źródło
Oprócz tego, co powiedział @wisekiddo, możesz również zmodyfikować ustawienia kompilacji w
project.pbxproj
pliku, ustawiając Swift 3 @obj Inference na domyślne, tak jakSWIFT_SWIFT3_OBJC_INFERENCE = Default;
dla twoich smaków kompilacji (tj. Debugowania i wydania), szczególnie jeśli pochodzisz z innego środowiska oprócz Xcodeźródło