相关疑难解决方法(0)

如何创建符合Swift和Objective-C之间共享协议的类方法?

我最近一直在学习Swift.

我决定编写一个混合的Swift/Objective-C应用程序,它使用两种语言实现的相同算法完成计算密集型任务.

该程序计算大量素数.

我定义了一个协议,Swift和Objective-C版本的计算对象都应该符合.

对象都是单例,所以我在Objective-C中创建了一个典型的单例访问方法:

+ (NSObject <CalcPrimesProtocol> *) sharedInstance;
Run Code Online (Sandbox Code Playgroud)

整个协议看起来像这样:

#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
Run Code Online (Sandbox Code Playgroud)

该类的Objective-C版本完全按照上面的定义实现方法,不用担心.

swift版本有一个方法:

  class func sharedInstance() -> CalcPrimesProtocol
Run Code Online (Sandbox Code Playgroud)

但是,如果我使该方法成为协议的必需方法,我得到编译器错误"类型"CalcPrimesSwift不符合协议'CalcPrimesProtocol'.

但是,如果我在协议中将单例类方法sharedInstance标记为可选,那么它可以工作,我可以在我的Swift类或Objective-C类上调用该方法.

我是否错过了Swift类方法定义中的一些细微之处?考虑到我可以在我的Swift类或Objective-C类上调用sharedInstance()类方法,这似乎不太可能.

您可以从Github下载该项目,如果您愿意,可以查看它.它叫做SwiftPerformanceBenchmark.(链接)

interop objective-c objective-c-protocol swift objective-c-nullability

9
推荐指数
1
解决办法
2319
查看次数