objective-c - 在与主类分开的 .m 文件中实现 objc 协议(protocol)方法?

标签 objective-c xcode

我试图将 NSCoding 的方法从我的实际类中分离到单独的文件中。我知道您通常可以在 Objective-C 中使用 Categories 定义新方法,但似乎 Xcode 在未遇到主类文件中的 -encodeWithCoder: 和 -initWithCoder: 方法时仍会发送警告。

我这样做的原因(希望这听起来不太复杂)是我有许多类分布在各种文件中,并且为了避免写出 encodeWithCoder:/initWithCoder 的乏味和冗余:对于每个类的方法,我编写了一个小脚本来自动解析头文件并根据变量类型生成必要的编码/解码代码,并将结果转储到单个 Encoders.m 中。结果链接正确,但我在编译期间仍然收到警告“类‘MyClass’的不完整实现”、“未找到‘-initWithCoder:’的方法定义”(等)和“类‘MyClass’未完全实现'NSCoding' 协议(protocol)”。我试过简单地将声明添加到类的 .h 文件中,但没有成功。

有什么方法可以通知 Xcode 这些方法实际上已实现,只是不在非类别类文件中?

一个简化的例子:

MyClass.h

@interface MyClass : NSObject <NSCoding> {
    int num;              //@ENCODABLE
    float timer;          //@ENCODABLE
    SomeOtherClass *obj;  //@ENCODABLE
}
...
@end

MyClass.m

#import "MyClass.h"
@implementation MyClass
...
@end

编码器.m

#import "MyClass.h"
@implementation MyClass (Encoding)
-(void) encodeWithCoder:(NSCoder*)encoder {
    // Auto-generated encoding of instance variables
}
-(id) initWithCoder:(NSCoder*)decoder {
    if (self = [self init]) {
        // Auto-generated decoding of instance-variables
    }
    return self;
}
@end

最佳答案

在类的接口(interface)、类扩展或接口(interface)或扩展指定的协议(protocol)中声明的任何方法都必须在主 @implementation block 中实现,否则您将收到警告。没有办法在那些地方声明一个方法并告诉编译器它将在一个类别中。您可以做的是创建一个类别接口(interface)并在那里声明 NSCoding 协议(protocol)。如果将此接口(interface)添加到主头文件,任何导入头文件的文件都会知道该类支持编码,但编译器不会提示未实现这些方法。

新建MyClass.m

@interface MyClass : NSObject {
    int num;              //@ENCODABLE
    float timer;          //@ENCODABLE
    SomeOtherClass *obj;  //@ENCODABLE
}
...
@end
@interface MyClass (Encoding) <NSCoding>
@end

关于objective-c - 在与主类分开的 .m 文件中实现 objc 协议(protocol)方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7215854/

相关文章:

ios - tableView.cellForRow(at : IndexPath(row:0, section:0)) 返回 nil 尽管滚动到 tableView 顶部

xcode - 如何在 tabBar swift 中更改项目或图像颜色?

ios - UITableView 宽度约束无法正常工作

ios - 如果另一列存在,SQLite 更新列

ios - 检查 ios 中的位置

xcode - Cocoapods -lPods-{pod name} mach-o 链接器错误

objective-c - 开关条件有 boolean 值?

iphone - 创建一个简单的 Simon 克隆 : How to wait between updates?

ios - swift/iOS : IBOutlet nil after loading view controller

ios - 如何使用 Xcode 9/iOS 11 简单地使用 Twilio 发送短信?