Bei der Verwendung von Xcode 9 Beta bin ich kurz auf folgende Warnung gestoßen:
Die Verwendung von Swift 3 @objc-Inferenz im Swift 4-Modus ist veraltet. Bitte wenden Sie sich an veraltete @objc-Inferenzwarnungen, testen Sie Ihren Code mit der Protokollierung "Verwendung veralteter Swift 3 @objc-Inferenzen" und deaktivieren Sie die Swift 3 @objc-Inferenz. **
Nach einiger Recherche habe ich immer noch keine Ahnung, wie ich das Problem beheben kann. Ich würde mich sehr über Tipps zur Behebung dieses Problems sowie eine Erläuterung der Abläufe freuen.
Mein Ziel ist es, mit meinem Code ein besseres Verständnis dafür zu gewinnen, was passiert.
Diese Warnung wurde durch das Ändern der Build-Einstellung "Swift 3 @objc Inference" meiner Ziele in "Default" aufgehoben.
Aus diesem Artikel :
Vor Swift 4 stellte der Compiler einige Swift-Deklarationen automatisch für Objective-C zur Verfügung. Wenn beispielsweise eine Unterklasse von NSObject erstellt wurde, erstellte der Compiler Objective-C-Einstiegspunkte für alle Methoden in solchen Klassen. Der Mechanismus wird als @objc-Inferenz bezeichnet.
In Swift 4 ist eine solche automatische @objc-Inferenz veraltet, da die Generierung all dieser Objective-C-Einstiegspunkte teuer ist. Wenn "Swift 3 @objc Inference" auf "On" gesetzt ist, kann der alte Code verwendet werden. Es werden jedoch veraltete Warnungen angezeigt, die angegangen werden müssen. Es wird empfohlen, diese Warnungen zu "korrigieren" und die Einstellung auf "Default" zu setzen. Dies ist die Standardeinstellung für neue Swift-Projekte.
Bitte beachten Sie auch diesen Swift-Vorschlag für weitere Informationen.
@objc
Inferenz? Was ist los?In Swift 3
führt der Compiler an verschiedenen Stellen @objc
aus, so dass dies nicht erforderlich ist. Mit anderen Worten, es stellt sicher, dass Sie @objc
für Sie hinzufügen!
In Swift 4
führt der Compiler dies nicht mehr (so oft) durch. Sie müssen jetzt @objc
explizit hinzufügen.
Wenn Sie ein Pre-Swift 4-Projekt haben, erhalten Sie standardmäßig Warnungen dazu. In einem Swift 4-Projekt erhalten Sie Build-Fehler. Dies wird über die Buildeinstellung Swift_SWIFT3_OBJC_INFERENCE
gesteuert. In einem Pre-Swift 4-Projekt ist dies auf On
gesetzt. Ich würde empfehlen, dies auf Default
(oder Off
) zu setzen, was jetzt die Standardoption für ein neues Projekt ist.
Es wird einige Zeit dauern, um alles zu konvertieren, aber da dies die Standardeinstellung für Swift 4 ist, lohnt es sich.
Es gibt zwei Möglichkeiten, den Code zu konvertieren, damit sich der Compiler nicht beschwert.
Eine davon ist, @objc
für jede Funktion oder Variable zu verwenden, die für die Objective-C-Laufzeit verfügbar gemacht werden muss:
@objc func foo() {
}
Die andere Möglichkeit ist, @objcMembers
durch eine Class
-Deklaration zu verwenden. Dadurch wird sichergestellt, dass @objc
zu ALL automatisch die Funktionen und Variablen in der Klasse hinzufügt. Dies ist der einfache Weg, der jedoch mit Kosten verbunden ist. Beispielsweise kann die Größe Ihrer Anwendung dadurch erhöht werden, dass Funktionen verfügbar gemacht werden, die nicht verfügbar gemacht werden mussten.
@objcMembers class Test {
}
@objc
und warum ist es notwendig?Wenn Sie neue Methoden oder Variablen in eine Swift-Klasse einführen, werden sie durch Markieren als @objc
für die Objective-C-Laufzeitumgebung freigegeben. Dies ist erforderlich, wenn Sie über Objective-C-Code verfügen, der Ihre Swift-Klasse verwendet, oder wenn Sie Objective-C-Funktionen wie Selectors
verwenden. Beispielsweise das Zielaktionsmuster: button.addTarget(self, action:#selector(didPressButton), for:.touchUpInside)
@objc
markieren?Es gibt Negative, die dazu führen, dass etwas als @objc
markiert wird:
Bitte bedenken Sie, dass dies eine Zusammenfassung auf hoher Ebene ist und komplizierter ist als ich geschrieben habe. Ich würde empfehlen, den aktuellen Vorschlag zu lesen, um weitere Informationen zu erhalten.
Migrator kann nicht alle Funktionen identifizieren, für die @objc Inferenziert Objective-C als mit deprecated gekennzeichnete Thunks erforderlich ist, um Sie beim Auffinden zu unterstützen
• Erstellen Sie Warnungen zu veralteten Methoden
• Konsolennachrichten, wenn veraltete Thunks ausgeführt werden
Ich hatte diese Warnung mit der Einstellung "Swift 3 @objc Inference" = "Default". Dann wurde mir klar, dass für das Projekt festgelegt wurde - nicht für das Ziel. Stellen Sie daher sicher, dass Sie in Ihrem Ziel "Standard" festgelegt haben, um die Warnung zu entfernen.
Sie können einfach an "default" statt "ON" übergeben. Scheint mehr an Apple Logik.
(Alle anderen Kommentare zur Verwendung von @obj
bleiben jedoch gültig.)
In der Tat werden Sie diese Warnungen los, indem Sie Swift 3 @objc Inference ..__ deaktivieren. Allerdings können subtile Probleme auftauchen. Zum Beispiel wird KVO nicht mehr funktionieren .. Dieser Code hat unter Swift 3 einwandfrei funktioniert:
for (key, value) in jsonDict {
if self.value(forKey: key) != nil {
self.setValue(value, forKey: key)
}
}
Nach der Migration zu Swift 4 und dem Festlegen von "Swift 3 @objc Inference" auf "Standard", bestimmte Funktionen meines Projekts funktionierten nicht mehr . Ich brauchte ein wenig Debugging und Nachforschungen, um eine Lösung dafür zu finden . Nach meinem besten Wissen sind hier die Optionen:
Das erneute Aktivieren von @objc-Inferenz führt Sie zu den Warnungen, aber es ist die schnellste Lösung. Beachten Sie, dass es nur für Projekte verfügbar ist, die von einer früheren Swift-Version migriert wurden .. Die anderen beiden Optionen sind langwieriger und erfordern einige Code-Digging-Tests und umfangreiche Tests.
Siehe auch https://github.com/Apple/Swift-evolution/blob/master/proposals/0160-objc-inference.md
Swift 3 @objc-Inferenz Die Verwendung von Swift 3 @objc-Inferenz im Swift 4-Modus ist veraltet. Bitte adressieren Sie die veralteten @objc-Inferenzwarnungen, testen Sie den Code mit der Protokollierung "Verwendung der veralteten Swift 3 @objc-Inferenz", und deaktivieren Sie die Inferenz, indem Sie die Build-Einstellung "Swift 3 @objc Inference" in "Default" für "XMLParsingURL" ändern Ziel.
zu dem gekommen
Der erste Schritt erhielt die Build-Einstellung
Suchen Sie in Build Setting Inference
swift 3 @objc Inference Default ändern
Sie können versuchen, "Pod Update" und/oder "flattern sauber"
Ich habe diese Einstellung auch in xcode gesetzt.
Die Einstellung der Objective-C-Schnittstelle lautet wie folgt:
Ich bin ein gelegentlicher iOS-Entwickler (bald mehr), aber ich konnte die Einstellung immer noch nicht so finden, dass sie sich an der anderen Antwort orientiert (da ich diesen Keychain-Gegenstand nicht hatte, der die Antwort zeigt), und nun dachte ich, dass ich ihn gefunden habe Ich kann diesen Schnappschuss einfach mit den hervorgehobenen Orten hinzufügen, auf die Sie klicken und suchen müssen.
Alles, was Sie brauchen, führen Sie einfach einen Test durch, bis der Vorgang abgeschlossen ist. Danach gehen Sie zu Build Setting, In In Build Build Inference suchen. das ist alles was ich gemacht habe und perfekt gearbeitet habe.
Die Verwendung von Swift 3 @objc-Inferenz im Swift 4-Modus ist veraltet?
benutze func call @objc
func call(){
foo()
}
@objc func foo() {
}
Zusätzlich zu @wisekiddo können Sie auch Ihre Build-Einstellungen in der project.pbxproj
-Datei ändern, indem Sie die Swift 3 @obj-Inferenz für Ihre Build-Varianten (dh Debug und Release) auf Swift_SWIFT3_OBJC_INFERENCE = Default;
setzen, insbesondere wenn Sie von einigen stammen andere Umgebung neben Xcode