对于已经非常广泛的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数据由另一个应用程序写入)。但是,可能有更好的解决方法。