2
votes

Comment réparer `` Impossible de remplacer un type de retour automatique avec un type de retour non automatique '' après la mise à niveau de Xcode

J'essaie de créer une application iOS AWS et j'ai des problèmes.

Je viens de mettre à jour Xcode vers la version 10.2 et de créer un tout nouveau projet. J'en suis au point où j'essaye d'installer les dépendances avec CocoaPods pour l'authentification des utilisateurs. Après avoir modifié mon fichier pod pour inclure AWSMobileClient (et avoir exécuté pod install --repo-update comme le dit la documentation AWS), j'obtiens une erreur de construction dans AWSMobileClient.swift dans cette fonction:

Cannot override a Self return type with a non-Self return type

L'erreur dit ceci:

@objc override public class func sharedInstance() -> AWSMobileClient {
   return _sharedInstance
}

Je suis vraiment coincé ici et la seule chose que je pense à faire à ce stade est de revenir à Xcode 10.1.

Toute aide serait grandement appréciée.


3 commentaires

Pourquoi pensez-vous que XCode est le problème? Fonctionnait-il dans XCode 10.1 et sa mise à niveau l'a cassé?


J'ai créé un nouveau projet dans XCode 10.1 il y a quelques jours et je n'ai jamais eu de problèmes lors de l'installation. J'ai fini par mettre à niveau ce matin vers 10.2 et créer un nouveau projet et c'est quand j'ai rencontré ce problème


La seule solution est de demander à AWS de fournir une compatibilité Swift 5. J'espère que vous avez soumis ce problème avec eux.


3 Réponses :


2
votes

Comme l'erreur l'indique, vous devez renvoyer Self ici si la classe n'est pas finale.

@objc public class func sharedInstance() -> TheActualClass { return _sharedInstance }

(cela suppose que _sharedInstance code> est de type Self.)

Alternativement, vous pouvez modifier la superclasse pour ne pas renvoyer Self , et à la place renvoyer un type spécifique (probablement propre type).

@objc override public class func sharedInstance() -> Self { return _sharedInstance }

(Toutes les sous-classes devront dans ce cas également renvoyer TheActualClass. Je suppose que la classe est AWSMobileClient.)

Puisque c'est un framework, je m'attendrais à ce que cela soit corrigé par le fournisseur, et je m'assurerais que vous exécutez la version la plus récente du framework.

Self indique que cette méthode renvoie une valeur du type de la classe appelée. Donc, si vous avez SomeClass.sharedInstance () , vous devez renvoyer un SomeClass . Mais si vous sous-classez cela, alors un appel à SubClass.sharedInstance () doit renvoyer une SubClass . Si vous n'y parvenez pas, vous devrez rendre quelque chose de définitif, ou ne pas retourner Self.

Ceci est cependant un remplacement très étrange. Ce que ce code tente d’obtenir n’est pas clair.


5 commentaires

Salut Rob! Merci pour la réponse. J'ai également essayé votre solution et elle renvoie l'erreur suivante: Impossible de convertir l'expression de retour de type 'AWSMobileClient' en type de retour 'Self'


Comment puis-je modifier la superclasse pour renvoyer son propre type au lieu de Self?


J'ai essayé ces deux solutions et j'ai toujours la même erreur! Dois-je signaler un problème à AWS ou à Apple? Ou les deux?


AWS si vous utilisez du code AWS et que vous n'avez pas mis à jour leur dernière bibliothèque. Certainement pas Apple; il n'y a rien de mal avec Swift. C'est une erreur dans le cadre.


oui, car mettre du pansement sur une bibliothèque tierce qui est clairement incompatible avec Swift 5 est une si bonne idée ...



4
votes

En tant que solution temporaire, définissez la classe de la méthode . Par exemple, AWSMobileClient est maintenant:

public final class AWSMobileClient: _AWSMobileClient {

Changez sur ceci:

public class AWSMobileClient: _AWSMobileClient {

Et puis attendez les correctifs AWS.

p >


2 commentaires

Merci beaucoup!! Cette solution a parfaitement fonctionné. Je suis resté bloqué pendant 3 jours à ce sujet, je ne saurais trop vous remercier !! J'ai également soumis cela comme un bogue à AWS, donc j'espère qu'ils pourront le comprendre de leur côté. Tellement content!!


@rolandforbes Je suis heureux d'aider! Merci aussi d'avoir soumis le bogue! En attente également d'une solution :)



3
votes

Nous avons rencontré ce problème, mais avons hésité à modifier directement AWSMobileClient.

Définition de la version de Swift Language sur 4.2 pour le projet et les cibles ainsi que la spécification dans le fichier Pod:

post_install do |installer|
    installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            config.build_settings['SWIFT_VERSION'] = '4.2'
        end
    end
end


0 commentaires