Добавление необязательного метода класса 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 записываются другим приложением). Однако может быть более приятное решение.

0 ответов

Другие вопросы по тегам