2017-09-04 10 views
1

Je déclare dans mon dossier Swift:erreur protocole Swift

protocol SocketManagerDelegate { 
    func webSocketDidReceiveMessage(message:Message) 
    func socketWasReconnected() 
    func webSocketDidFailWithError(error:String) 
} 

import Foundation 
import MDWamp 
import SSKeychain 

@objc(SocketManager) 
class SocketManager: NSObject, MDWampClientDelegate{ 

    static let instance = SocketManager() 

    var delegate:SocketManagerDelegate? 

et je veux utiliser le protocole dans un fichier ObjC:

#import <Project-Swift.h> 

@interface ChatManager() <SocketManagerDelegate> 
@end 

@implementation ChatManager......... 

Je reçois cette erreur:

enter image description here

Impossible de comprendre cela. Des idées?

Dans mon fichier project-swift.h la variante delegate est pas à l'affiche du tout:

SWIFT_CLASS_NAMED("SocketManager") 
@interface SocketManager : NSObject <MDWampClientDelegate> 
SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly, strong) 
SocketManager * _Nonnull instance;) 
+ (SocketManager * _Nonnull)instance SWIFT_WARN_UNUSED_RESULT; 
@property (nonatomic, strong) MDWamp * _Null_unspecified wampConnection; 
@property (nonatomic, readonly, copy) NSString * _Nonnull socketUrlSecure; 
@property (nonatomic, readonly, copy) NSString * _Nonnull socketUrl; 
+1

Essayez protocole @objc SocketManagerDelegate: class {} –

+0

@MikeAlter votre solution a fait l'affaire. Merci. Ajoutez une réponse et je l'accepterai. – Gal

+0

Bienvenue, Ajouté la réponse ci-dessous –

Répondre

2

Vous utilisez le protocole rapide

protocol SocketManagerDelegate { 
    func webSocketDidReceiveMessage(message:Message) 
    func socketWasReconnected() 
    func webSocketDidFailWithError(error:String) 
} 

que ne peut pas être utilisé dans obj-c sans

@Objc déclaration

s'il vous plaît remplacer votre code avec

@objc protocol SocketManagerDelegate:class { 
    func webSocketDidReceiveMessage(message:Message) 
    func socketWasReconnected() 
    func webSocketDidFailWithError(error:String) 
} 
1

project-swift.h ne seront pas générés/mis à jour jusqu'à ce que votre application n'a pas d'erreur. Si la construction de l'application échoue project-swift.h ne sera pas mis à jour.

C'est une sorte de scénario de verrouillage mort.

Solution:

Étape 1: Supprimer la confirmation du protocole dans l'objectif - fichier C

#import <Project-Swift.h> 

@interface ChatManager() /*<SocketManagerDelegate> delete this*/ 
@end 

Etape 2: propre et re-construction projet

Étape 3: Maintenant, vérifiez Project-Swift.h qui devrait maintenant avoir votre déclaration de protocole

Étape 4: Maintenant, confirmez le protocole en vous r Objectif -C fichier et construction.

EDIT:

construit Swift à apparaître dans Project-Swift.h ils doivent être soit NSObject ou NSObjectProtocol

Changer votre définition de protocole à

@objc protocol SocketManagerDelegate : NSObjectProtocol { 
    func webSocketDidReceiveMessage(message:Message) 
    func socketWasReconnected() 
    func webSocketDidFailWithError(error:String) 
} 
1

Votre protocole ne confirmez objC.Protocoles rapide et à objc sont différentes

add clas à votre protocole:

@objc protocol SocketManagerDelegate: class { 
    func webSocketDidReceiveMessage(message:Message) 
    func socketWasReconnected() 
    func webSocketDidFailWithError(error:String) 
} 

MISE À JOUR

Ajoutez également le drapeau @objc

+1

L'ajout de 'class' seul n'a pas résolu le problème. J'ai dû ajouter '@ objc' au début. – Gal