2016-12-10 11 views
5

staramy się odwoływać do metod szybkich w implementacji celu-c.Metoda swift 3 w celu-c kończy się niepowodzeniem bez widocznego interfejsu @ dla "MySwiftClass" deklaruje selektor 'addX: andY'

Swift 3 Klasa:

import Foundation 
@objc class MySwiftClass: NSObject { 
    override init() { 
     super.init() 
    } 

    func sayHello() -> Void { 
     print("hello"); 
    } 

    func addX(x:Int, andY y:Int) -> Int { 
    return x+y 
    } 
} 

Objective-C realizacja (Objective-cm):

#import "ProductModuleName-Swift.h" 
MySwiftClass* getData = [[MySwiftClass alloc]init]; 
[getData sayHello] //works 
[getData addX:5 addY:5] //No visible @interface for 'MySwiftClass' declares selector 'addX:addY' 
+2

Definicja '' ... Andy ... i nazwać '' ... ... Addy różnią. – shallowThought

+0

Proszę wyjaśnić. – complexi

+1

'addY:'! = 'AndY:' Nawet komunikat o błędzie w temacie nie jest taki sam jak w kodzie – vadian

Odpowiedz

12

Jeśli Command na "ProductModuleName-Swift.h" w Xcode edytora plików źródłowego następnie można zobaczyć jak metody Swift są mapowane na Objective-C.

W twoim przypadku to byłoby

@interface MySwiftClass : NSObject 
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; 
- (void)sayHello; 
- (NSInteger)addXWithX:(NSInteger)x andY:(NSInteger)y; 
@end 

który nazywa się

MySwiftClass* getData = [[MySwiftClass alloc]init]; 
[getData sayHello]; 
NSInteger result = [getData addXWithX:5 andY:5]; 

Lepszym Swift 3 nazwa metody może być

func add(x: Int, y:Int) -> Int 

ponieważ x już jest argument (zewnętrzna) nazwa pierwszego parametru . Możesz również dodać atrybut @objc() do definicji Swift , aby kontrolować nazwę celu C. Na przykład, z

@objc(addX:andY:) 
func add(x: Int, y: Int) -> Int { 
    return x+y 
} 

byłoby nazwać z Objective-C, jak

NSInteger result = [getData addX:5 andY:5]; 
+0

Polecenie z kliknięciem polecenia na "ProductModuleName-Swift.h" jest bardzo użyteczne. Nadal borykam się, jak uzyskać dostęp do statycznej, szybkiej funkcji z obiektywnego C++ – Paulus

+7

Jako aktualizację w Swift 4 potrzebujemy teraz @objc z przodu każdej funkcji Swift, którą chcesz udostępnić dla Objective-C; w tym zmienne obiektowe. – ekscrypto

+0

Mam również ten sam problem: Brak widocznego interfejsu @ dla "EvrythngHelper" deklaruje selektor i używam szybkiego 4 i próbuję użyć kodu swift wewnątrz klasy obiektu C++ –

Powiązane problemy