2015-01-27 25 views
6

Bazı kodları Objective-c'den Swift'e geçirmeye çalışıyorum, ancak Objective-c protokolüyle Swift sınıfına uymak ve bu sınıftan objetive-c sınıfına erişmek istediğimde başarımda sorun yaşıyorum . Yanlış bir şey yapıyorum ama göremiyorum. testi (test_class.h) içinSwift sınıfına Objective c protokolü. Tanınmayan yöntem

Amaç-c protokolü ve obj-c sınıfı

#import <Foundation/Foundation.h> 

@protocol test_delegate 

-(void)returnData:(NSString*)data InMethod:(NSString*)method; 
@end 

@interface test_class : NSObject 

@property (weak, nonatomic) id<test_delegate> delegate; 
-(void)sendData:(NSString *)data; 
@end 

Amaç-c uygulaması

#import "test_class.h" 

@implementation test_class 

-(id) init{ 
    self = [super init]; 
    if (self != nil){ 
     self.delegate= nil; 
    } 
    return self; 
} 
-(id) initWithDelegate:(id<test_delegate>) delegate{ 
    self = [super init]; 
    if (self != nil){ 
     self.delegate = delegate; 

    } 
    return self; 
} 


-(void)sendData:(NSString *)data{ 

    [self.delegate returnData:data InMethod:@"method test"]; 
} 
@end 

objetive-c brigde dosya

// 
// Use this file to import your target's public headers that you would like to expose to Swift. 
// 

#import "test_class.h" 

Hızlı dosya (FirstViewController.swift)

Nihayet hata derleme sadece Obj-c sınıfları çalışıyor kullanarak bana

2015-01-27 08:21:05.787 Test[4566:51164] -[Test.FirstViewController returnData:InMethod:]: unrecognized selector sent to instance 0x7fa6abd0aa20 
2015-01-27 08:21:05.792 Test[4566:51164] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Test.FirstViewController returnData:InMethod:]: unrecognized selector sent to instance 0x7fa6abd0aa20' 

Bu kodu verir. Ne yapıyorum yanlış? Xcode 6.1.1 ve dağıtım hedefi

iOS 8.0 Kullanılması

şimdiden teşekkürler.

GÜNCELLEME: Bir amaç-c protokolünden bazı yöntem uyguladıklarında Swift garip bir davranışı vardır: param adı bir minik harfle başlamalıdır begginig başka, derleyici, sana bir derleme zamanı hatası verip değilse, bir çalışma zamanı hatası verin.

@protocol test_delegate 

-(void)returnData:(NSString*)data InMethod:(NSString*)method; 
@end 

için:

buldum tek çözüm, nesnel-c protokol yöntemi tanımına bu şekilde modifiye olduğu

@protocol test_delegate 

-(void)returnData:(NSString*)data inMethod:(NSString*)method; 
@end 

bu değişikliği yaparak, mükemmel çalışır.

Bu davranış için birisinin yanıtı varsa, bunun neden olduğunu açıklamak ve açıklamaktan memnuniyet duyarız.

GÜNCELLEME 2: sınıfları adları ve değişkenler isimlerle Swift başka garip sorunu işaret etmek @Adam Freeman için teşekkür ederiz. Kopyalandı (onun izni ile) kodu buraya:

Protokol temsilci yönteminiz, sınıfını parametrelerden biri olarak alırsa, bunun dikkat edilmesi gereken başka bir şey de budur. Bu örneği kullanarak: Bu TestClass sorunlara neden olur

#import <Foundation/Foundation.h> 

@class TestClass; 
@protocol TestDelegate 
-(void)TestClass:(TestClass*)TestClass returnData:(NSString*)data inMethod:(NSString*)method; 
@end 

@interface TestClass : NSObject 

@property (weak, nonatomic) id<TestDelegate> delegate; 
-(void)sendData:(NSString *)data; 
@end 

sizin Swift kod bulunan edilmektedir. düzeltmedir:

#import <Foundation/Foundation.h> 

@class TestClass; 
@protocol TestDelegate 
-(void)testClass:(TestClass*)testClass returnData:(NSString*)data inMethod:(NSString*)method; 
@end 

@interface TestClass : NSObject 

@property (weak, nonatomic) id<TestDelegate> delegate; 
-(void)sendData:(NSString *)data; 
@end 

arada Swift Spec sınıfları ve delegeler gibi şeyler küçük harfle başlamalıdır bir büyük harf ve yöntemleri ve parametre adları ile başlaması gerektiğini belirtmektedir.

+2

'InMethod' (Objective-C) 'nin" inMethod "(Swift) ile büyük harf kullanımını kontrol edin. – Grimxn

+0

Cevabınız için teşekkürler grimxn. Söyledikleriniz doğrudur, ancak inhod (hızlı) xcode derleyicisinden yararlanmaya çalışırsanız size bir hata verir. Protokol yönteminden başka bir çözüm yok veya bir ara nesne oluştur. Ben – Neonamu

cevap

6

Değişimi:

func returnData(data: String!, inMethod method: String!) { 

func returnData(data: String!, InMethod method: String!) { 

için ve çalışması gerekir. inMethod'da büyük harf kullanın.

+0

ana yazıda bir güncelleme koyacağız aynı hata büyük bir hata yapıyordum .. Teşekkürler zaman kazandı .. – iCoder86

1

Karşılaştığım ve dikkat edilmesi gereken bir başka nokta da (this!) Düzeltmek için bana yardımcı oldu ve diğerlerinin de çalışabilmesi, protcol delege yönteminizin kendi sınıfını parametrelerden biri olarak almasıdır. Böyle Bu TestClass sorunlara neden olur>

#import <Foundation/Foundation.h> 

@class TestClass; 
@protocol TestDelegate 
-(void)TestClass:(TestClass*)TestClass returnData:(NSString*)data inMethod:(NSString*)method; 
@end 

@interface TestClass : NSObject 

@property (weak, nonatomic) id<TestDelegate> delegate; 
-(void)sendData:(NSString *)data; 
@end 

== sizin Swift kod bulunan varlık olarak. düzeltmedir:

#import <Foundation/Foundation.h> 

@class TestClass; 
@protocol TestDelegate 
-(void)testClass:(TestClass*)testClass returnData:(NSString*)data inMethod:(NSString*)method; 
@end 

@interface TestClass : NSObject 

@property (weak, nonatomic) id<TestDelegate> delegate; 
-(void)sendData:(NSString *)data; 
@end 

arada Swift Spec sınıfları ve delegeler gibi şeyler küçük harfle başlamalıdır bir büyük harf ve yöntemleri ve parametre adları ile başlaması gerektiğini belirtmektedir. Bunun çok seçici olduğunu biliyorum ama test_class gerçekten Apple'ın özelliklerine göre TestClass olmalıdır.

+0

Sizin izninizle, ana yazıyı yorumlarınızla güncelleyeceğim. Bence ana soru gibi Swift sözdizimi için başka bir "tuhaf" durum ve bunun hakkında daha fazla şey bilmek güzel. Teşekkürler! – Neonamu

+0

@Neonamu bunun için git! –

+0

şimdi ana gönderide. Burada sdk, xcode ve swift'in hangi sürümünü kullandığını açıklayabilir misiniz? tüm vakaların daha iyi bildiği için :). Herhangi bir şeyi değiştirmek isterseniz, lütfen bu yazıyı bana bildirmekten çekinmeyin ve bunu güncelleyeceğim (veya kendiniz yapın!) – Neonamu

İlgili konular