gpt4 book ai didi

ios - Swift 类的 Objective-c 协议(protocol)。无法识别的方法

转载 作者:搜寻专家 更新时间:2023-10-30 21:56:19 25 4
gpt4 key购买 nike

我正在尝试将一些代码从 Objective-c 迁移到 Swift,但是当我想要使 Swift 类符合 Objective-c 协议(protocol)并从 objetive-c 类访问此类时,我在开始时遇到了问题。我做错了什么,但我没有看到。

用于测试的 Objective-c 协议(protocol)和 obj-c 类 (test_class.h)

#import <Foundation/Foundation.h>

@protocol test_delegate

-(void)returnData:(NSString*)data InMethod:(NSString*)method;
@end

@interface test_class : NSObject

@property (weak, nonatomic) id<test_delegate> delegate;
-(void)sendData:(NSString * )data;
@end

Objective-c 实现

#import "test_class.h"

@implementation test_class

-(id) init{
self = [super init];
if (self != nil){
self.delegate= nil;
}
return self;
}
-(id) initWithDelegate:(id<test_delegate>) delegate{
self = [super init];
if (self != nil){
self.delegate = delegate;

}
return self;
}


-(void)sendData:(NSString *)data{

[self.delegate returnData:data InMethod:@"method test"];
}
@end

Objetive-c 桥接文件

//
// Use this file to import your target's public headers that you would like to expose to Swift.
//

#import "test_class.h"

Swift 文件 (FirstViewController.swift)

import UIKit

class FirstViewController: UIViewController, test_delegate {

var test : test_class!

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
test = test_class()
test.delegate=self
test.sendData("show in log")
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}

func returnData(data: String!, inMethod method: String!) {
NSLog(data)
}


}

最后编译报错

2015-01-27 08:21:05.787 Test[4566:51164] -[Test.FirstViewController returnData:InMethod:]: unrecognized selector sent to instance 0x7fa6abd0aa20
2015-01-27 08:21:05.792 Test[4566:51164] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Test.FirstViewController returnData:InMethod:]: unrecognized selector sent to instance 0x7fa6abd0aa20'

此代码仅使用 Obj-c 类就可以正常工作。我做错了什么?

使用 Xcode 6.1.1 和部署目标 iOS 8.0

提前谢谢你。

更新:当从 objective-c 协议(protocol)实现一些方法时,Swift 有一个奇怪的行为:参数的名称必须以开头的小字母开头,否则,编译器会给你一个编译时错误,如果不是,给你一个运行时错误。

我找到的唯一解决方案是这样修改 objective-c 协议(protocol)方法定义:

@protocol test_delegate

-(void)returnData:(NSString*)data InMethod:(NSString*)method;
@end

到:

@protocol test_delegate

-(void)returnData:(NSString*)data inMethod:(NSString*)method;
@end

进行此更改后,它运行完美。

如果有人对此行为有答案,欢迎发帖并解释为什么会这样。

更新 2:感谢 @Adam Freeman 指出 Swift 的另一个奇怪的问题,其中包含类名和变量名。在此处复制(经他许可)代码:

另一件需要注意的事情是,如果您的协议(protocol)委托(delegate)方法将其类作为其参数之一。使用这个例子:

#import <Foundation/Foundation.h>

@class TestClass;
@protocol TestDelegate
-(void)TestClass:(TestClass*)TestClass returnData:(NSString*)data inMethod:(NSString*)method;
@end

@interface TestClass : NSObject

@property (weak, nonatomic) id<TestDelegate> delegate;
-(void)sendData:(NSString * )data;
@end

这将导致在您的 Swift 代码中找到 TestClass 的问题。修复是:

#import <Foundation/Foundation.h>

@class TestClass;
@protocol TestDelegate
-(void)testClass:(TestClass*)testClass returnData:(NSString*)data inMethod:(NSString*)method;
@end

@interface TestClass : NSObject

@property (weak, nonatomic) id<TestDelegate> delegate;
-(void)sendData:(NSString * )data;
@end

顺便说一下,Swift 规范规定类和委托(delegate)之类的东西应该以大写字母开头,而方法和参数名称应该以小写字母开头。

最佳答案

改变:

func returnData(data: String!, inMethod method: String!) {

func returnData(data: String!, InMethod method: String!) {

它应该可以工作。您在 inMethod 中使用大写字母。

关于ios - Swift 类的 Objective-c 协议(protocol)。无法识别的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28165292/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com