Kurz gesagt, während ich Xcode 9 Beta verwende, ist folgende Warnung aufgetreten:
Die Verwendung von Swift 3 @objc-Inferenz im Swift 4-Modus ist veraltet. Bitte adressieren Sie veraltete @ OBJC-Inferenzwarnungen, testen Sie Ihren Code mit aktivierter Protokollierung "Verwendung veralteter Swift 3 @ OBJC-Inferenz" und deaktivieren Sie Swift 3 @ OBJC-Inferenz. **
Nach einigen Recherchen habe ich immer noch keine Ahnung, wie ich das Problem beheben kann. Ich würde mich über Tipps zur Behebung dieses Problems sowie über eine Erklärung der Vorgänge sehr freuen.
Mein Ziel ist es, ein besseres Verständnis dafür zu erlangen, was mit meinem Code passiert.
swift
swift4
xcode9-beta
DaleK
quelle
quelle
Antworten:
Ich habe diese Warnung beseitigt, indem ich die Build-Einstellung "Swift 3 @objc Inference" meiner Ziele auf "Standard" geändert habe.
Aus diesem Artikel :
Weitere Informationen finden Sie auch in diesem Swift-Vorschlag .
quelle
@objc
Inferenz im Swift 4-Modus ist veraltet. Bitte beheben Sie veraltete@objc
Inferenzwarnungen, testen Sie Ihren Code mit@objc
aktivierter Protokollierung " Verwendung veralteter Swift 3- Inferenz " und deaktivieren Sie die Swift 3-@objc
Inferenz." Haben Sie eine Idee, wo Sie die besagte Swift 3-@objc
Inferenzprotokollierung aktivieren können ?- Was ist
@objc
Folgerung? Was ist los?In
Swift 3
schließt der Compiler@objc
an mehreren Stellen, sodass Sie dies nicht tun müssen. Mit anderen Worten, es stellt sicher,@objc
für Sie hinzuzufügen !In macht
Swift 4
der Compiler dies nicht mehr (so viel). Sie müssen jetzt@objc
explizit hinzufügen .Wenn Sie ein Projekt vor Swift 4 haben, erhalten Sie standardmäßig Warnungen dazu. In einem Swift 4-Projekt werden Buildfehler angezeigt. Dies wird über die
SWIFT_SWIFT3_OBJC_INFERENCE
Build-Einstellung gesteuert . In einem Pre-Swift 4-Projekt ist dies auf eingestelltOn
. Ich würde empfehlen, dies aufDefault
(oderOff
) zu setzen, was jetzt die Standardoption für ein neues Projekt ist.Es wird einige Zeit dauern, bis alles konvertiert ist, aber da dies die Standardeinstellung für Swift 4 ist, lohnt es sich, dies zu tun.
- Wie stoppe ich die Compiler-Warnungen / Fehler?
Es gibt zwei Möglichkeiten, Ihren Code zu konvertieren, damit sich der Compiler nicht beschwert.
Eine Möglichkeit besteht darin,
@objc
für jede Funktion oder Variable zu verwenden, die für die Objective-C-Laufzeit verfügbar gemacht werden muss:Die andere ist
@objcMembers
durch eineClass
Erklärung zu verwenden. Dies stellt sicher , automatisch hinzufügen ,@objc
um ALL die Funktionen und Variablen in der Klasse. Dies ist der einfache Weg, der jedoch Kosten verursacht. Beispielsweise kann er die Größe Ihrer Anwendung erhöhen, indem Funktionen verfügbar gemacht werden, die nicht verfügbar gemacht werden mussten.- Was ist
@objc
und warum ist es notwendig?Wenn Sie einer Swift-Klasse neue Methoden oder Variablen hinzufügen, werden sie durch Markieren als
@objc
für die Objective-C-Laufzeit verfügbar gemacht. Dies ist erforderlich, wenn Sie über Objective-C-Code verfügen, der Ihre Swift-Klasse verwendet, oder wenn Sie Funktionen vom Typ Objective-C wie verwendenSelectors
. Zum Beispiel das Zielaktionsmuster:button.addTarget(self, action:#selector(didPressButton), for:.touchUpInside)
- Warum sollte ich nicht alles markieren
@objc
?Es gibt Negative, die mit der Kennzeichnung von etwas verbunden sind als
@objc
:Bitte denken Sie daran, dass dies eine Zusammenfassung auf sehr hoher Ebene ist und dass sie komplizierter ist als ich geschrieben habe. Ich würde empfehlen, den aktuellen Vorschlag zu lesen, um weitere Informationen zu erhalten.
Quellen:
quelle
@objc
Dies bedeutet keinen dynamischen Versand. Swift kann den statischen oder virtuellen Versand verwenden (und möglicherweise einen anderen Code ausführen). Dasdynamic
Schlüsselwort ist erforderlich, um Swift zur Verwendung des dynamischen Versands zu zwingen.@objc
beraubt, was müssen wir verwenden?SWIFT_SWIFT3_OBJC_INFERENCE
beiOn
. Konvertieren Sie zu Swift 4. Dann packen Sie das@objc
Zeug an. Befolgen Sie zur Vereinfachung die folgenden Grundregeln: Wenn die Swift-Klasse im Objc-C-Code verwendet wird (über den Bridging-Header), verwenden Sie@objcMembers
andernfalls das Add-by-One-Add@objc
. Verwenden Sie einfach die Xcode-Suche, um herauszufinden, ob die Swift-Klasse aus einer beliebigen.m
Datei aufgerufen wird. Dies sollte die Umwandlung relativ schmerzfrei machen.@objc
Swift 4 geändert hat, und dann die Entscheidung zu treffen, das Projekt zu reparieren und es gleich zu halten.Migrator kann nicht alle Funktionen identifizieren, für die @objc Inferred Objective-C- Thunks erforderlich sind, die als veraltet markiert sind , damit Sie sie leichter finden können.
• Erstellen Sie Warnungen zu veralteten Methoden.
• Konsolenmeldungen beim Ausführen veralteter Thunks
quelle
Ich hatte diese Warnung mit der Einstellung "Swift 3 @objc Inference" = "Default". Dann wurde mir klar, dass dies für das Projekt festgelegt wurde - nicht für das Ziel. Stellen Sie also sicher, dass Sie in Ihrem Ziel die Einstellung "Standard" haben, um die Warnung zu entfernen.
quelle
Sie können einfach auf "Standard" anstatt auf "EIN" übergeben. Scheint mehr an der Apple-Logik festzuhalten.
(aber alle anderen Kommentare zur Verwendung von
@obj
bleiben gültig.)quelle
In der Tat werden Sie diese Warnungen entfernen, indem Sie Swift 3 @objc Inference deaktivieren. Es können jedoch subtile Probleme auftreten. Zum Beispiel wird KVO nicht mehr funktionieren. Dieser Code funktionierte perfekt unter Swift 3:
Nach der Migration auf Swift 4 und der Standardeinstellung von "Swift 3 @objc Inference" funktionierten bestimmte Funktionen meines Projekts nicht mehr . Ich musste einige Fehler beheben und nachforschen, um eine Lösung dafür zu finden. Nach meinem besten Wissen sind hier die Optionen:
Wenn Sie die @ ojjc-Inferenz erneut aktivieren, erhalten Sie die Warnungen, aber dies 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 beiden anderen Optionen sind langwieriger und erfordern einige Code-Grabungen und umfangreiche Tests.
Siehe auch https://github.com/apple/swift-evolution/blob/master/proposals/0160-objc-inference.md
quelle
Ich bin ein gelegentlicher iOS-Entwickler (bald mehr), aber ich konnte die Einstellung immer noch nicht anhand der anderen Antwort finden (da ich diesen Schlüsselbund nicht hatte, den die Antwort zeigt), also dachte ich jetzt, da ich ihn gefunden hatte Ich könnte diesen Schnappschuss einfach mit den hervorgehobenen Stellen hinzufügen, auf die Sie klicken und suchen müssen.
quelle
Sie können versuchen, "Pod Update" und / oder "Flattern sauber"
Ich habe diese Einstellung auch in xcode eingestellt.
Die Einstellung für die Objective-C-Schnittstelle lautet wie folgt:
quelle
Swift 3 @objc Inferenz Die Verwendung der Swift 3 @objc Inferenz im Swift 4-Modus ist veraltet. Bitte adressieren Sie veraltete @ OBJC-Inferenzwarnungen, testen Sie Ihren Code mit aktivierter Protokollierung "Verwendung veralteter Swift 3 @ OBJC-Inferenz" und deaktivieren Sie dann die Inferenz, indem Sie die Build-Einstellung "Swift 3 @ OBJC-Inferenz" für "XMLParsingURL" auf "Standard" ändern. Ziel.
kam zum
Der erste Schritt war Build Setting
Suchen Sie in, um Einstellungsinferenz zu erstellen
change swift 3 @objc Inference Default
Geben Sie hier die Bildbeschreibung ein
quelle
Alles, was Sie brauchen, ist nur ein Test, warten Sie bis zum Ende. Gehen Sie danach zu Build Setting, Search in Build Setting Inference und ändern Sie swift 3 @objc Inference in (Default). Das ist alles, was ich getan und perfekt gearbeitet habe.
quelle
benutze func call @objc
quelle
Zusätzlich zu den Aussagen von @wisekiddo können Sie Ihre Build-Einstellungen in der
project.pbxproj
Datei ändern, indem Sie die Swift 3 @obj-Inferenz auf die StandardeinstellungenSWIFT_SWIFT3_OBJC_INFERENCE = Default;
für Ihre Build- Varianten (z. B. Debug und Release) setzen, insbesondere wenn Sie aus einer anderen Umgebung stammen neben Xcodequelle