将objective-C类的可选方法添加到swift扩展

时间:2015-06-11 11:55:14

标签: macos swift cocoa swift-extensions objective-c-protocol

对于已经非常广泛的Objective-C应用程序,我想添加Core Data功能。最近的增加是在Swift中,到目前为止,这种方法运作良好。

因为我的Objective-C AppDelegate已经包含了很多东西,所以我决定给AppDelegate写一个Swift扩展。我发现除了以下内容之外,Objective-C和Swift部分都可以非常愉快地生活在一起。

我从一个空的Swift核心数据项目的Swift模板中复制的核心数据。

问题在于可选方法applicationShouldTerminate:(来自NSApplicationDelegate协议),我没有在类的遗留Objective-C部分中定义。但Swift扩展中的定义不会被编译,因为该方法似乎是双重定义的。显然,没有提到Obj-C源中的可选方法会导致包含默认版本。

我尝试在Obj-C中实现一个虚拟applicationShouldTerminate:,在Swift中调用applicationShouldterminate2(sender),但是Obj-C没有看到扩展中的方法。是否有办法,例如@objc我可以使符号可见吗?

有关我应如何处理的任何提示?

重要的是要知道我的Swift扩展与核心数据的东西最初编译好了。当我升级到XCode 6.3b2(我认为)时,首先发生了符号冲突。之前没有冲突。我现在在XCode 7b1,但仍然没有雪茄。

编辑:添加源代码
文件" AppDelegate.h":

#import <Cocoa/Cocoa.h>
@interface AppDelegate : NSObject <NSApplicationDelegate>
{
//stuff for swift extension
  NSPersistentStoreCoordinator *_pSCo;
  NSManagedObjectContext *_mOC;
}
-(NSString *)diag_mOC_descr;
@property (strong) IBOutlet NSPanel *window;
...
#pragma mark for Swift Core Data extension (workaround for iVars)
@property (strong) NSPersistentStoreCoordinator *pSCo;
@property (strong) NSManagedObjectContext *mOC;
@end

文件&#34; AppDelegate.m&#34;

#import "AppDelegate.h"
#import "MainWindowController.h"
@implementation AppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { ... }

// allow Core Data in Swift
-(NSString *)diag_mOC_descr { return _mOC.description; } //diag to test whether _mOC is used by property
...
//properties
@synthesize window = _window;
...
// See swift extension for CoreData stuff
@end

的AppDelegate + CD.Swift

import Foundation
extension AppDelegate {
  ...
  // MARK: - Core Data stack
  func applicationDocumentsDirectory () -> NSURL  {...}
  ... //all the regular methods from the swift Core Data stuff ending in:
  func applicationShouldTerminate(sender: NSApplication) -> NSApplicationTerminateReply { ...
  }
}

NSApplicationDelegate协议具有以下定义

SWIFT
optional func applicationShouldTerminate(_ sender: NSApplication) -> NSApplicationTerminateReply
OBJECTIVE-C
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender

错误讯息:

/Volumes/.../AppDelegate+CD.swift:150:8: Method 'applicationShouldTerminate' with Objective-C selector 'applicationShouldTerminate:' conflicts with previous declaration with the same Objective-C selector

我认为,自XCode6.3b2起,编译器会生成一个默认的&#34; applicationShouldTerminate:&#34;定义,虽然它之前没有。
我目前的解决方法是完全注释掉func applictionShouldTerminate {...}(我预计会受到很小的伤害,因为我以只读方式访问CD数据 - CD数据由另一个应用程序写入)。但是,可能有更好的解决方法。

0 个答案:

没有答案