Ich fange an, Swift zu lernen und habe die sehr guten Videovorträge der Stanford University auf YouTube verfolgt. Hier ist ein Link, wenn Sie interessiert sind oder es hilft (obwohl es nicht erforderlich ist, mein Problem zu verstehen):
Entwickeln von iOS 8-Apps mit Swift - 2. Mehr Xcode und Swift, MVC
Während ich den Vorlesungen folgte, kam ich zu einem Punkt, an dem (soweit ich das beurteilen konnte) mein Code mit dem Code im Video identisch war, aber auf meinem System ein Compilerfehler auftrat. Nach vielen Versuchen und Irrtümern habe ich es geschafft, meinen Code auf zwei Beispiele zu reduzieren, von denen eines einen Fehler erzeugt, das andere oder nicht, aber ich habe keine Ahnung, was den Fehler tatsächlich verursacht oder wie er behoben werden kann.
Der Code, der den Fehler verursacht, lautet:
import UIKit
class BugViewController: UIViewController
{
func perform(operation: (Double) -> Double) {
}
func perform(operation: (Double, Double) -> Double) {
}
}
Dies erzeugt den folgenden Compilerfehler:
Methode 'perform' mit Objective-C-Selektor 'perform:' widerspricht der vorherigen Deklaration mit demselben Objective-C-Selektor
Durch einfaches Entfernen der Unterklasse von UIViewController wird der Code kompiliert:
import UIKit
class BugViewController
{
func perform(operation: (Double) -> Double) {
}
func perform(operation: (Double, Double) -> Double) {
}
}
Einige andere Informationen, die relevant sein können oder nicht:
- Ich habe kürzlich ein Upgrade auf Yosemite durchgeführt.
- Als ich Xcode installiert habe, habe ich eine Beta-Version (Version 6.3 (6D543q)) erhalten, da dies (wenn ich mich richtig erinnere) die Version war, die ich für meine Version von OS X benötigte.
Ich hoffe halb, dass dies ein Fehler im Compiler ist, da dies sonst für mich keinen Sinn ergibt. Jede Hilfe sehr dankbar erhalten!
Antworten:
Objective-C unterstützt keine Methodenüberladung. Sie müssen einen anderen Methodennamen verwenden. Wenn Sie UIViewController geerbt haben, haben Sie NSObject geerbt und die Klasse für Obj-C interopierbar gemacht. Swift hingegen unterstützt das Überladen. Deshalb funktioniert es, wenn Sie die Vererbung entfernen.
quelle
UIFont
jeden Tag.Ich selbst nehme auch am Standford-Kurs teil und bin auch schon lange hier festgefahren, aber nach einigem Suchen habe ich etwas von hier gefunden: Xcode-Versionshinweise und es wurde unten etwas erwähnt:
Was ich getan habe, war nur "privat" vor der Override-Methode wie folgt hinzuzufügen:
quelle
Wie bereits beantwortet, unterstützt ObjC das Überladen von Methoden nicht (zwei Methoden mit demselben Namen). In Swift 2 unter Xcode 7 gibt es zwei Möglichkeiten, um diese Art von Problemen zu lösen. Eine Möglichkeit besteht darin, die Methode mithilfe des Attributs umzubenennen:
@objc(newNameMethod:)
Eine weitere Möglichkeit, dieses Problem in Xcode 7+ zu lösen, besteht darin,
@nonobjc
Attribute auf eine beliebige Methode, einen Index oder einen Initialisierer anzuwendenquelle
Das Problem
UIViewController
ist eine@objc
Klasse. Wenn von vererbenUIViewController
,BugViewController
ist auch eine@objc
Klasse.Dies bedeutet, dass es den Regeln der Objective-C-Selektoren (dem Namen einer Methode) entsprechen muss. Die Methoden
func perform(operation: (Double) -> Double)
undfunc perform(operation: (Double, Double) -> Double)
beide haben den gleichen Selektor@selector(perform:)
. Das ist nicht erlaubt.Um dies zu beheben, verwenden Sie verschiedene Namen: like
func perform1(operation: (Double) -> Double)
undfunc perform2(operation: (Double, Double) -> Double)
.Ich denke, der beste Weg, damit umzugehen, besteht darin, Ihren
perform()
Methoden aussagekräftigere Namen zu geben . Was machen diese Methoden? Wie ändern sie den Status des View Controllers? Schauen Sie sich die anderenUIViewController
Methoden an, um ein Gefühl für den Stil der Methodenbenennung zu bekommen, oder lesen Sie Methodennamen sollten innerhalb einer Klasse ausdrucksstark und eindeutig seinquelle
Unter https://developer.apple.com/library/ios/releasenotes/DeveloperTools/RN-Xcode/Chapters/xc6_release_notes.html finden Sie unter "Xcode 6.3 Release Notes" -> "Swift Language Changes"
quelle
Ich habe den gleichen Fehler erhalten, weil ich zwei Methoden mit derselben Obj-C-Signatur habe:
Ich wollte einen von ihnen nicht als @nonobjc markieren, da zur Laufzeit möglicherweise unvorhergesehene Konsequenzen auftreten. (Jemand kann mich korrigieren, wenn es keine Möglichkeit gibt)
Es wurde behoben, indem die Funktion für externe Parameternamen von Swift (ich habe den externen Namen mit dem lokalen Namen identisch gemacht) für die zweite Methode verwendet wurde, wodurch die Signatur der Obj-c-Methode effektiv geändert wird:
quelle