2017-03-08 611 views
-1
使用Objective-C代表团

我想实现一个objectve-C代表团到我迅速类,但我不断收到斯威夫特

Type 'ViewController' does not conform to protocol 

这是我的Objective-C类

#import <Foundation/Foundation.h> 
#import <CoreBluetooth/CoreBluetooth.h> 


@protocol BT_BLE_LibDelegate; 
@interface BT_BLE_Lib : NSObject< CBCentralManagerDelegate> 
{ 
    NSObject<BT_BLE_LibDelegate> __weak *delegate; 
    NSError *BTError; 
    int BLEMode; 
} 
@property (nonatomic, weak) id<BT_BLE_LibDelegate> __weak delegate; 
- (void) UARTSend:(NSString*)message;   // UART 送到藍芽 
- (int) iBeaconStartScan;     // 找 iBeacon 
- (int) iBeaconStopScan;      // 停止 iBeacon 
- (int) ConnectBlueTooth;     // 連接藍芽 
- (int) BlueToothConnectStatus;    // 藍芽連接情況 
- (void) DigitalOuts:(NSString*)sender;  // 藍芽接腳數位輸出 
- (void) DigitalInput;      // 藍芽接腳數位輸入 
@end 

@protocol BT_BLE_LibDelegate 
- (void) BlueToothStatus:(NSString*)errorMsg; // 取的HW 藍牙的連接情況 

- (void) DidReceiveData:(NSString*)message; // 收到資料 

- (void) DidReadHardwareRevisionString:(NSString*)Msg; // 硬體相關的訊息 
- (void) DigitalInputPinsChanges:(NSString*)Msg; // 數位輸入的情況改變 
- (void) DidReceiveiBeacon:(NSString*)Name RSSI:(NSNumber *)RSSI Action:(NSString*)Action;       // iBeacon 的情況 
@end 

这是我的雨燕类

import UIKit 

class ViewController: UIViewController , BT_BLE_LibDelegate{ 

var myObj : BT_BLE_Lib? 
override func viewDidLoad() { 

    super.viewDidLoad() 
    myObj = BT_BLE_Lib() 
    myObj?.delegate = self 

} 

func DidReceiveData(message: NSString?) { 

} 

func BlueToothStatus(errorMsg: NSString?) { 

}// 取的HW 藍牙的連接情況 

func DidReadHardwareRevisionString(Msg: NSString?) { 

}// 硬體相關的訊息 
func DigitalInputPinsChanges(Msg: NSString?) { 

}// 數位輸入的情況改變 
func DidReceiveiBeacon(Name: NSString?, RSSI: Int, Action: NSString?) { 

} 

注:我试过的参数的名称或添加之前添加_ - >功能后无效,但相同的结果

+2

请[编辑]你的问题,替换实际的复制图像并粘贴代码。 – rmaddy

+0

ok .. done ...... –

+0

你已经声明你的Swift函数是接受一个可选的,但你没有设置他在目标C端的可空性 – Paulw11

回答

-1

好吧,我找到了解决方案 我刚刚用String替换了NSString!

public func didReceiveiBeacon(_ Name: String!, rssi RSSI: NSNumber!, action Action: String!) 

现在我有没有语法错误.. 但该方法不工作(我用调试器)

+0

你不想要'!'。 – rmaddy

0

您已命名的Objective-C的协议,您的委托方法不正确使用驼峰,但是Swift在导入协议时为你解决了这个问题。因此,您的斯威夫特代表实施需要如下所示:

func didReceiveData(_ message: String?) { 

} 

func blueToothStatus(_ errorMsg: String?) { 

} 

func didReadHardwareRevisionString(_ Msg: String?) { 

} 

func digitalInputPinsChanges(_ Msg: String?) { 

} 

func didReceiveiBeacon(_ Name: String?, rssi RSSI: NSNumber, action Action: String?) { 

} 

请注意小写的第一个字母。我也不确定这些参数是否可选;我建议你更新你的Objective-C协议以使用正确的命名方式,并指出参数的可空性或其他参数(_Nonnull_Nullable)。喜欢的东西:

@protocol BT_BLE_LibDelegate 
- (void) blueToothStatus:(NSString* _Nullable)errorMsg; // 取的HW 藍牙的連接情況 

- (void) didReceiveData:(NSString* _Nullable)message; // 收到資料 

- (void) didReadHardwareRevisionString: (NSString* _Nullable)Msg; // 硬體相關的訊息 
- (void) digitalInputPinsChanges:(NSString* _Nullable)Msg; // 數位輸入的情況改變 
- (void) didReceiveiBeacon:(NSString* _Nullable)Name RSSI:(NSNumber * _Nonnull)RSSI Action:(NSString* _Nullable)Action;       // iBeacon 的情況 
@end 

而且,在风格的主题,iOS的采用驼峰,不pythonesque下划线,所以你的方案应该是这样BtBLELibDelegate

+0

那么..目标-C类是从我正在使用的框架..所以不能改变它 –

+0

好吧,然后只是改变你的Swift方法名称有一个小写的第一个字母,它会工作。请务必进行防御性编码并正确解开这些选项,因为Objective-C签名不会告诉你这些参数是否具有值 – Paulw11

+0

我认为问题出在框架之内..因为只有一个函数可以工作,它甚至不能正常工作虽然它在我的Objective-C项目中工作得很好。不过谢谢。 –