Ich habe ein Upgrade auf Xcode 11 und Swift 5 durchgeführt und bin auf ein Problem mit Methodenerweiterungen gestoßen, wenn diese über ein Framework verfügbar gemacht werden. Genauer gesagt, in einem Projekt, das wie folgt strukturiert ist:
-> Main Project
-> Framework created from sources in 'Main Project'
-> Subproject using the above Framework (Sources packaged in the framework are not visible to the sub-project)
Alles wird kompiliert und läuft einwandfrei, aber wenn Debug-Sitzungen für das Teilprojekt ausgeführt werden, werden alle Erweiterungen in 'Framework' zurückgegeben, error: ambiguous use of
wenn sie über die lldb-Befehlszeile aufgerufen werden. Hier ist ein Codebeispiel, um eine Idee zu geben:
Erstellen Sie ein Befehlszeilenprojekt für macOs und fügen Sie ein neues Ziel, 'MagicFramework', und in einer Datei Spells.swift hinzu (stellen Sie sicher, dass die Datei für Main & MagicFramework sichtbar ist).
import Foundation
extension String {
public func castSpell() -> String {
return "✨ " + self
}
}
Erstellen Sie dann ein Unterprojekt 'Wizard' und in einer Datei wizard.swift (nur für Wizard sichtbar):
import Foundation
import MagicFramework
public class Tadaa {
public func magic(spell:String) -> String {
return spell.castSpell()
}
}
Fügen Sie in der Datei main.swift des Assistenten Folgendes hinzu:
import Foundation
let aa = Tadaa().magic(spell: "this is magic")
print(aa)
Sie sollten die folgende Struktur haben:
-> Main project
----> MagicFramework
----> Wizard subproject
Erstellen und führen Sie dann das Sub "Wizard" mit einem Haltepunkt spell.castSpell()
in Tadaa
. Geben Sie an der lldb-Eingabeaufforderung Folgendes ein:
(lldb)po spell.castSpell()
error: <EXPR>:3:1: error: ambiguous use of 'castSpell()'
spell.castSpell()
Warum?? Dieses Problem trat bei Xcode 10 nicht auf.
quelle
Ich hatte das gleiche Problem mit meiner Erweiterung. In meiner Situation ist dies eine einzelne Funktion, die ich beim Debuggen häufig verwende. Daher habe ich gerade eine globale Funktion erstellt, die in Ihrem Fall nur die Zeichenfolge akzeptiert und diese Erweiterung im Inneren aufruft. Wirklich ähnlich dem, worauf @aepryus im Kommentar zur ersten Antwort hingewiesen hat.
Dann benutze es so:
quelle