2014-06-20 12 views
6

Piszę rozszerzenie Swift do mojej klasy ObjC. Chociaż mój kod kompiluje i działa doskonale, Dostaję kilka Xcode ostrzeżeń (jeden na każdej metody Swift):Rozszerzenie Swift "Nie znaleziono definicji metody"

"Method definition for 'foo_method:' not found" 
    "Method definition for 'bar_method:' not found" 
    "Method definition for 'baz_method:' not found" 

nie żyje proste odtworzyć wiadomość Xcode. Że wykonana ten projekt demo z czterech linii kodu nie schematycznych:

Cel -C (podklasa NSView)

// Subclass_of_NSView.h 

#import <Cocoa/Cocoa.h 

@interface Subclass_of_NSView : NSView 

@end 


// Subclass_of_NSView.m 

@implementation Subclass_of_NSView 

- (instancetype)initWithFrame:(NSRect)frame 
//______________^ WARNING: Method definition for resizeSubviewsWithOldSize: not found 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code here. 
    } 
    return self; 
} 

@end 

Swift (rozszerza podklasy obj-C)

// Extension_of_Subclass.swift 

import Foundation 

extension Subclass_of_NSView { 

    override func resizeSubviewsWithOldSize(old_bounds_size:NSSize) { 

    } 

} 

pomostowymi -Header

// Demo_Project-Bridging-Header.h 

#import "Subclass_of_NSView.h" 

Zgaduję, że ostrzeżenia znikną, jeśli albo:

a) stwórz kilka fałszywych metod w pliku .m mojej klasy ObjC.

b) w rozszerzeniu Swift, rozszerz moją nadklasę klasy ObjC.

Nie kocham żadnego z tych rozwiązań.

Czy istnieje lepszy sposób, aby kompilator był szczęśliwy?

+2

Powinieneś opublikować kod myślę, że –

+0

Zrobiłem kilka zrzutów ekranu. Sam kod byłby prawdopodobnie mylący, ponieważ zaangażowane są potencjalnie 4 pliki. – Charlesism

+0

Myślę, że to błąd, który powinien być zgłoszony – Sulthan

Odpowiedz

2

Nie jestem pewien, co tu się dzieje, myślę, że problem ma związek z tym, jak NSView jest zmostkowany do szybkiego języka.

Jeśli zamierzasz zastąpić te metody, upewnij się, że wywołujesz implementację super, ponieważ NSView prawdopodobnie bez nich pęknie spektakularnie. Jednak nie jestem pewien, czy nawet to jest bezpieczne, może się jeszcze zepsuć NSView - być może przyczyną błędów jest dziwna/niestandardowa konfiguracja, którą robi Apple.

Gdybym był tobą, po prostu bym znosił ostrzeżenia kompilatora i zgłoś problem Apple przez http://bugreport.apple.com. Mam nadzieję, że zostanie on naprawiony w przyszłej wersji beta Xcode 6.

+1

Pobrałem najnowszy podgląd wersji deweloperskiej. Apple to naprawił. – Charlesism

0

Miałem podobne problemy (mimo że nie mogłem odtworzyć problemu z kodu podanego przez ciebie). Nie sądzę, że ma to coś wspólnego z tym, jak NSView, czy jakakolwiek inna klasa, jest połączona z Swift. Myślę, że ma to głównie związek z problemami z widocznością widoczności. Klasa Objective-C i rozszerzenie Swift nie widzą się nawzajem w wewnątrz.

Tak więc, na przykład, jeśli klasa Objective-C ma metodę foo, rozszerzenie Swift nie może wywołać foo(), ponieważ nie może jej zobaczyć. Rozwiązaniem jest zadeklarowanie foo w pliku klasy Objective-C .h (nagłówek), który następnie można zaimportować w nagłówku pomostowym.

Ale ta sztuczka zabiera cię tylko do tej pory; w końcu osiągasz punkt, w którym niezdolność dwóch baz kodów staje się przytłaczająca i łatwiej jest napisać całą klasę w jednym lub drugim języku.

+0

Nie jestem pewien, czy rozumiem co masz na myśli. Nie mam problemu z dostępem do publicznych metod mojej klasy ObjC od Swift. Nie mam problemu z dostępem do metod Swift z ObjC. Nie mogę zadeklarować moich nowych metod Swift w moim pliku ObjC .h, ponieważ Swift już je * zadeklarował. W związku z tym musiałbym je zaimplementować w pliku .m i zastąpić je rozszerzeniem Swift. Po prostu uważam, że napisanie 30 pustych metod jest stratą czasu i sprawia, że ​​mój plik .m jest mylący. – Charlesism

2

To jest stare pytanie, ale nadal widzę ten problem z Xcode 7.3.1.

Powód, dla którego nie widzę funkcji publicznej zdefiniowanej w Objctive-C, ponieważ Nie uwzględniłem całej klasy w parametrach nagłówka mostu. Patrz przykład więcej:

klasy I zdefiniowane w celu C, takie jak:

Foo.h

@interface Foo : NSObject 
- (void)function1; 
- (void)function2:(Bar *)para; // here Bar is just another object 
@end 

Foo.m

@implementation Foo 
// ... 
@end 

I w nagłówku mojego mostu mam #import "Foo.h", ale nie #import "Bar.h" . W rezultacie mogę zadzwonić pod numer function1 z mojego szybkiego rozszerzenia, ale nie pod numer function2.

Foo.swift

extension Foo { 
    func function3() { 
     function1(); // Okay 
     function2(nil); // Method definition not found 
    } 
} 

Tak, dodając #import "Bar.h" do nagłówka mostu rozwiązuje problem.

Powiązane problemy