【发布时间】:2016-06-16 00:37:23
【问题描述】:
我在 Swift 中定义了一个协议:
@objc public protocol UploadProtocol: class {
func isUploaded() -> Bool
...
}
我正在将我的ProjectName-Swift.h 文件导入我的ProjectName_Prefix.pch 文件(旧项目)中。
在 Objective-C 中,我在实现协议的类上有一个类别。我试图弄清楚如何让编译器知道该实现。这就是我一直在做的:
// Person+Upload.h
#import "Person.h"
@interface Person (Upload)
- (BOOL)isUploaded;
@end
// Person+Upload.m
#import "Person+Upload.h"
@implementation Person (Upload)
...
@end
这给了我:
找不到“UploadProtocol”的协议定义
我只能想到其他三种设置方法,但它们都有问题。我错过了什么?
第一种方式(Apple 推荐)
在 Using Swift with Cocoa and Objective-C (Swift 2.2) 中,Apple 表示:“Objective-C 类可以在其实现 (.m) 文件中采用 Swift 协议,方法是导入 Xcode 生成的 Swift 代码头文件和使用类扩展。”但是他们的示例是针对标准课程的。如果我尝试对我的类别执行此操作:
// Person+Upload.h
#import "Person.h"
@interface Person (Upload)
- (BOOL)isUploaded;
@end
// Person+Upload.m
#import "Person+Upload.h"
@interface Person (Upload) <UploadProtocol>
@end
@implementation Person (Upload)
...
@end
这会导致:
在“人”界面上重复定义“上传”类别
第二种方式
好的,所以我想避免定义上传类两次。所以我会把它从.h中删除。
// Person+Upload.h
#import "Person.h"
@interface Person ()
- (BOOL)isUploaded;
@end
// Person+Upload.m
#import "Person+Upload.h"
@interface Person (Upload) <UploadProtocol>
@end
@implementation Person (Upload)
...
@end
在这种情况下,我得到:
类别正在实现一个方法,该方法也将由其主类实现
我目前在.h 中声明该方法,以便其他类可以调用其中一些方法,而无需强制转换为协议来访问该方法。
第三条路
如果我在.h 中保留类别名称,但在.m 中删除它
// Person+Upload.h
#import "Person.h"
@interface Person (Upload)
- (BOOL)isUploaded;
@end
// Person+Upload.m
#import "Person+Upload.h"
@interface Person () <UploadProtocol>
@end
@implementation Person (Upload)
...
@end
然后我得到:
类别正在实现一个方法,该方法也将由其主类实现
是否每次都将其转换为协议的唯一解决方案?在多个地方添加这种类型的行似乎是代码异味:
Person <Upload> *s = (Person <Upload> *)self;
还有其他解决方案吗?
【问题讨论】:
标签: objective-c swift swift-protocols