【发布时间】:2015-06-06 15:15:50
【问题描述】:
我最近一直在学习 Swift。
我决定编写一个混合 Swift/Objective-C 应用程序,该应用程序使用两种语言实现的相同算法来执行计算密集型任务。
程序计算大量素数。
我定义了一个计算对象的 Swift 和 Objective-C 版本都应该遵守的协议。
对象都是单例,所以我在Objective-C中创建了一个典型的单例访问方法:
+ (NSObject <CalcPrimesProtocol> *) sharedInstance;
整个协议如下所示:
#import <Foundation/Foundation.h>
@class ComputeRecord;
typedef void (^updateDisplayBlock)(void);
typedef void (^calcPrimesCompletionBlock)(void);
@protocol CalcPrimesProtocol <NSObject>
- (void) calcPrimesWithComputeRecord: (ComputeRecord *) aComputeRecord
withUpdateDisplayBlock: (updateDisplayBlock) theUpdateDisplayBlock
andCompletionBlock: (calcPrimesCompletionBlock) theCalcPrimesCompletionBlock;
@optional //Without this @optional line, the build fails.
+ (NSObject <CalcPrimesProtocol> *) sharedInstance;
@end
Objective-C 版本的类实现了上面定义的方法,不用担心。
swift版有个方法:
class func sharedInstance() -> CalcPrimesProtocol
但是,如果我将该方法设为协议的必需方法,则会收到编译器错误“类型”CalcPrimesSwift 不符合协议“CalcPrimesProtocol”。
但是,如果我在协议中将单例类方法 sharedInstance 标记为可选,它就可以工作,并且我可以在我的 Swift 类或我的 Objective-C 类上调用该方法。
我是否错过了我的 Swift 类方法定义中的一些微妙之处?这似乎不太可能,因为我能够在我的 Swift 类或我的 Objective-C 类上调用 sharedInstance() 类方法。
您可以从 Github 下载该项目,如果您愿意,可以查看一下。它被称为SwiftPerformanceBenchmark。 (链接)
【问题讨论】:
-
嗯。在黑暗中拍摄,但您的
class func是否应该返回符合CalcPrimesProtocol的AnyObject,而不是协议对象本身? -
感谢您的建议。如果我尝试这样做:
class func sharedInstance() -> AnyObject <CalcPrimesProtocol>我得到一个编译器错误“无法专门化非泛型类型'AnyObject'”。 -
当。也许我会克隆项目并搞砸它。
-
我很想再拥有一双眼睛。我被难住了。
-
@nhgrif 它只是在 Objective-C 中(我已经克隆了项目并检查了)。
标签: objective-c swift interop objective-c-protocol objective-c-nullability