Je commence à apprendre Swift et j'ai suivi les très bonnes conférences vidéo de l'Université de Stanford sur YouTube. Voici un lien si vous êtes intéressé ou si cela aide (bien qu'il ne soit pas nécessaire de comprendre mon problème):
Développer des applications iOS 8 avec Swift - 2. Plus Xcode et Swift, MVC
En suivant les cours, je suis arrivé à un point où (pour autant que je sache) mon code était identique au code de la vidéo mais sur mon système, j'ai eu une erreur de compilation. Après beaucoup d'essais et d'erreurs, j'ai réussi à réduire mon code à deux exemples, dont l'un génère une erreur, l'autre ou qui ne le fait pas, mais je n'ai aucune idée de ce qui cause réellement l'erreur ou comment la résoudre.
Le code qui crée l'erreur est:
import UIKit
class BugViewController: UIViewController
{
func perform(operation: (Double) -> Double) {
}
func perform(operation: (Double, Double) -> Double) {
}
}
Cela crée l'erreur de compilation suivante:
La méthode 'perform' avec le sélecteur Objective-C 'perform:' entre en conflit avec la déclaration précédente avec le même sélecteur Objective-C
En supprimant simplement la sous-classification de UIViewController, le code compile:
import UIKit
class BugViewController
{
func perform(operation: (Double) -> Double) {
}
func perform(operation: (Double, Double) -> Double) {
}
}
Quelques autres informations qui peuvent être pertinentes ou non:
- J'ai récemment mis à niveau vers Yosemite.
- Lorsque j'ai installé Xcode, je me suis retrouvé avec une version Beta (version 6.3 (6D543q)) parce que (si je me souviens bien), c'était la version dont j'avais besoin pour fonctionner sur ma version d'OS X.
J'espère à moitié que c'est un bogue dans le compilateur car sinon cela n'a aucun sens pour moi. Toute aide reçue avec reconnaissance!
Réponses:
Objective-C ne prend pas en charge la surcharge de méthode, vous devez utiliser un nom de méthode différent. Lorsque vous avez hérité d'UIViewController, vous avez hérité de NSObject et rendu la classe interopérable avec Obj-C. Swift, en revanche, prend en charge la surcharge, c'est pourquoi cela fonctionne lorsque vous supprimez l'héritage.
la source
UIFont
tous les jours.Je prends moi-même également le cours Standford et je suis resté coincé ici pendant longtemps aussi, mais après quelques recherches, j'ai trouvé quelque chose d'ici: Notes de publication Xcode et il a mentionné quelque chose ci-dessous:
ce que j'ai fait, c'était simplement d'ajouter "privé" devant la méthode de remplacement comme ceci:
la source
Comme il a déjà été répondu, ObjC ne prend pas en charge la surcharge de méthode (deux méthodes avec le même nom) et dans swift 2 sous Xcode 7, il existe deux options pour résoudre ce type de problèmes. Une option consiste à renommer la méthode à l'aide de l'attribut:
@objc(newNameMethod:)
une autre option pour résoudre ce problème dans Xcode 7+ consiste à appliquer un
@nonobjc
attribut à n'importe quelle méthode, indice ou initialiseurla source
Le problème est
UIViewController
une@objc
classe. Lors de l'héritage deUIViewController
,BugViewController
est également une@objc
classe.Cela signifie qu'elle doit être conforme aux règles des sélecteurs Objective-C (le nom d'une méthode). Les méthodes
func perform(operation: (Double) -> Double)
et lesfunc perform(operation: (Double, Double) -> Double)
deux ont le même sélecteur@selector(perform:)
. Ce n'est pas permis.Pour résoudre ce problème, utilisez des noms différents: comme
func perform1(operation: (Double) -> Double)
etfunc perform2(operation: (Double, Double) -> Double)
.Je pense que la meilleure façon de gérer cela est de donner à vos
perform()
méthodes des noms plus descriptifs. Que font ces méthodes? Comment changent-ils l'état du contrôleur de vue? Regardez les autresUIViewController
méthodes pour avoir une idée du style de dénomination des méthodes, ou lisez les noms de méthode doivent être expressifs et uniques dans une classela source
À partir de https://developer.apple.com/library/ios/releasenotes/DeveloperTools/RN-Xcode/Chapters/xc6_release_notes.html sous "Xcode 6.3 Release Notes" -> "Swift Language Changes", vous trouverez
la source
J'ai eu la même erreur car j'avais deux méthodes avec la même signature Obj-C:
Je ne voulais pas marquer l'un d'eux comme @nonobjc en raison de la possibilité de conséquences imprévues lors de l'exécution. (Quelqu'un peut me corriger s'il n'y a pas de possibilité)
Résolu en utilisant la fonction de nom de paramètre externe de Swift (j'ai fait le même nom externe que le nom local) à la deuxième méthode, qui change efficacement la signature de la méthode Obj-c:
la source