Swift协议错误

时间:2017-09-04 08:29:59

标签: ios swift swift-protocols

我在Swift文件中声明了protocol

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?

我想在ObjC文件中使用该协议:

#import <Project-Swift.h>

@interface ChatManager () <SocketManagerDelegate>
@end

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

我收到此错误:

enter image description here

无法解决这个问题。想法?

在我的project-swift.h文件中,变体delegate根本没有显示:

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;

3 个答案:

答案 0 :(得分:2)

您正在使用swift协议

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

不能在没有

的obj-c中使用

@Objc声明

请用

替换您的代码
@objc protocol SocketManagerDelegate:class {
   func webSocketDidReceiveMessage(message:Message)
   func socketWasReconnected()
   func webSocketDidFailWithError(error:String)
}

答案 1 :(得分:1)

在您的应用程序没有错误之前,不会生成/更新

project-swift.h。如果应用程序构建失败,project-swift.h将不会更新。

它是一种死锁情景。

解决方案:

步骤1:删除Objective-C file

中的协议确认
#import <Project-Swift.h>

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

第2步:现在清理并重新构建项目

步骤3:现在检查Project-Swift.h,它现在应该有你的协议声明

步骤4:现在确认Objective -C文件中的协议并构建。

修改

Swift构造出现在Project-Swift.h中,它们应该是NSObjectNSObjectProtocol

将协议def更改为

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

答案 2 :(得分:1)

您的协议未确认objC。 swift和objC中的协议是不同的

在你的协议中添加clas:

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

<强>更新

还添加标记@objc