Добавление необязательного метода класса target-C для быстрого расширения
В уже обширное приложение Objective-C я хотел добавить функциональность Core Data. Последние добавления в Swift, и до сих пор это работало хорошо.
Потому что моя цель-C AppDelegate
уже содержит некоторые вещи, я решил написать расширение Swift для AppDelegate
, Я обнаружил, что части Objective-C и Swift могут жить вместе довольно счастливо, за исключением следующего.
Материал Core Data, который я скопировал из шаблона Swift пустого проекта Swift Core Data.
Проблема с необязательным методом applicationShouldTerminate:
(от NSApplicationDelegate
протокол), который я не определяю в устаревшей части класса Objective-C. Но определение в расширении Swift не будет компилироваться, потому что метод, кажется, определен вдвойне. Очевидно, что отсутствие упоминания необязательного метода в источнике Obj-C приводит к включению версии по умолчанию.
Я пытался реализовать пустышку applicationShouldTerminate:
в Obj-C, который вызывает applicationShouldterminate2(sender)
в Swift, но Obj-C не видит методы в расширении. Есть ли способ, например, с @objc
что я могу сделать символ видимым?
Любые советы о том, как мне поступить?
Важно знать, что мое расширение Swift с компонентом Core Data изначально скомпилировано нормально. Столкновение символов впервые произошло, когда я обновился до 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
Файл "AppDelegate.m"
#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 компилятор генерирует значение по умолчаниюapplicationShouldTerminate:
определение, пока не было.
Мой текущий обходной путь - закомментировать func applictionShouldTerminate {...}
в целом (я ожидаю небольшого вреда, так как я получаю доступ к данным CD только для чтения - данные CD записываются другим приложением). Однако может быть более приятное решение.