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 bana2015-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.
'InMethod' (Objective-C) 'nin" inMethod "(Swift) ile büyük harf kullanımını kontrol edin. – Grimxn
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