2016-09-14 6 views
30

Ich habe gerade auf Xcode 8 und iOS 10 aktualisiert (mit der alten Swift Language Version)..dynamicType ist veraltet. Benutze 'type (of ...)' stattdessen

Der Versuch, mein Projekt erneut zu kompilieren, war eine Qual, auch wenn ich immer noch die alte Swift-Syntax verwendete. Dieses Mal verwendet eine meiner Funktionen NSBundle(forClass: self.dynamicType), aber jetzt erscheint, dass .dynamicType veraltet ist und Xcode es nicht einmal kompilieren will.

Sein Vorschlag ist, type(of: self) zu verwenden, aber das schlägt auch fehl. Wer kennt die Lösung? Vielen Dank.

+1

'NSBundle (forClass: self.dynamicType)' Kompiliert für mich in Swift 2.3, sind Sie sicher, dass "Use Legacy Swift Language Version" auf "Yes" gesetzt ist? Sie könnten immer versuchen, Ihren Build-Ordner zu bereinigen. – Hamish

+0

Ja, es ist gesetzt und ich kann den Effekt sehen, weil die Anzahl der Syntaxfehler von 30 auf 1 sinkt. Ich bin der Meinung, dass dieser Fehler mit dem neuen UIKit Framework im neuen iOS 10 SDK zusammenhängt, weshalb ich aktualisiert habe Xcode 8 schien sogar die alte Swift-Syntax zu aktivieren. – Rodrigo

+0

Macht nichts, meine letzte Aussage, UIKit ist immer noch die gleiche – Rodrigo

Antwort

1

@dfri Antwort funktioniert perfekt für Swift 3.

In Bezug auf Swift 2.3 war meine Lösung, Xcode (Befehl + Option + Shift + K) zu reinigen und alles in ~/Library/Developer/Xcode/DerivedData zu löschen. Das Problem verschwindet nicht sofort, aber nach einiger Zeit wird es diesen Fehler nicht mehr geben.

Vielleicht ist es ein Fehler, immerhin sind wir in 8.0. Ich hoffe, dass es in den nächsten Releases behoben wird.

Vielen Dank an alle.

+0

@sgonzalez Seine Antwort funktioniert für Swift 3. Ich verwendete Legacy Swift (2). – Rodrigo

30

(Das hält unten für Swift 3; nicht Vermächtnis Swift Sprachversion (2.3), aber so ist es nicht die OPs Frage nicht beantworten, aber könnte für Swift 3 Benutzer wertvoll sein, dennoch)

Wie in Ihrer Frage erwähnt, ist dynamicType jetzt (Swift 3) zugunsten type(of:) veraltet. Darüber hinaus:

  • NSBundle wurde Bundle umbenannt.
  • Der init(forClass:) Initialisierer von Bundle wurde in init(for:) umbenannt.

diese Änderungen Unter Berücksichtigung Für Swift 3 Sie initialisieren (eine vorhandene Instanz oder holen mit der bestimmten Klasse zugeordnet) Ihr Bundle Objekt auf folgende Weise:

class Foo { 
    func bar() ->() { 
     let bundle = Bundle(for: type(of: self)) 
     // ... 
    } 
} 
+1

OP verwendet die ältere Swift-Version, aka Swift 2.3 - so AFAIK sein aktueller Code sollte gültig sein – Hamish

+0

@Hamish Oh, ich lese gerade _ "Xcode 8 und iOS 10" _ xD danke! – dfri

+0

Kein Problem, ich dachte das gleiche auf den ersten Blick! – Hamish

Verwandte Themen