it-swarm.com.de

Die Verwendung von Swift 3 @objc-Inferenz im Swift 4-Modus ist veraltet?

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. 

437
DaleK

Diese Warnung wurde durch das Ändern der Build-Einstellung "Swift 3 @objc Inference" meiner Ziele in "Default" aufgehoben. 

 Disable Swift 3 @objc inference in Xcode9

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.

744
Evgenii

- Was ist @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.

- Wie stoppe ich die Compiler-Warnungen/Fehler?

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 {

}

- Was ist @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)

- Warum sollte ich nicht alles @objc markieren?

Es gibt Negative, die dazu führen, dass etwas als @objc markiert wird:

  • Vergrößerte Anwendungsbinärgröße 
  • Keine Funktionsüberladung

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.

Quellen:

247
kgaidis

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

 enter image description here

45
Hassan Taleb

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.

8
Dmitry

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.)

8
ingconti

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:

  • Aktivieren Sie "Swift 3 @objc Inference" (funktioniert nur, wenn Sie ein vorhandenes Projekt von Swift 3 migriert haben)  enter image description here
  • Kennzeichnen Sie die betroffenen Methoden und Eigenschaften als @objc  enter image description here
  • Aktivieren Sie die ObjC-Inferenz für die gesamte Klasse erneut, indem Sie @objcMembers verwenden. enter image description here

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

7
Karoly Nyisztor

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 

  1. Der erste Schritt erhielt die Build-Einstellung

  2. Suchen Sie in Build Setting Inference

  3. swift 3 @objc Inference Default ändern

Bildbeschreibung hier eingeben

2
Praveen Kumar

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:

ObjectiveC interface setting

1
wisekiddo

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.

  1. Beginnen Sie oben links
  2. Wählen Sie das Projektordnersymbol
  3. Wählen Sie Ihren Hauptprojektnamen unter dem Symbol des Projektordners.
  4. Wählen Sie auf der rechten Seite Build-Einstellungen.
  5. Wählen Sie Ihr Projekt unter TARGETS.
  6. Scrollen Sie sehr weit nach unten (oder suchen Sie nach der Word-Inferenz im Textfeld __.).

 Finding the setting

1
raddevus

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.

0
Acasey

Die Verwendung von Swift 3 @objc-Inferenz im Swift 4-Modus ist veraltet?

benutze func call @objc 

func call(){

foo()

}

@objc func foo() {

}
0
Puji Wahono

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

0
DaveNOTDavid