2015-06-29 24 views
6

Burada büyük sorun var. ObjC'de (this) yazılmış bir kütüphanem vardı. Orada tanımlanmış bir protokol vardı. Ben hızlı dosyasında kullanmaya çalıştığında ben sürekli alıyorum:ObjC protokolü Swift uygulamasında

Tür "XXX" Ben bir test projesi yapılmış şeyleri basitleştirmek için protokol "XXX" için

uymuyor - olması gerektiği Swift projesi olarak oluşturuldu. başlığını köprüleme olarak

@protocol MyProtocol <NSObject> 

- (NSString *)getAxisLabel:(id)axis Value:(CGFloat)value; 

@end 

:

Sonra objc başlık dosyası oluşturmak (tam olarak verilmiş dahil büyük harf/küçük harf maç için her adını ve değerini lütfen unutmayın) iç protokolü aşağıdaki (ı StupidProtocol.h denir):

#import "StupidProtocol.h" 

Ve sonra geri Swift dosyasında:

class ViewController: UIViewController, MyProtocol 
{ 
    func getAxisLabel(axis: AnyObject!, value: CGFloat) -> String! { 
     return "" 
    } 
} 

Ve otomatik tamamlama, getAxisLabel işlevini benim için tamamlamasa bile, bu hatayı tekrar denedik.

Sorunun "value" argümanı ve "Value" işlev parametresiyle ilgili olduğundan şüpheleniyorum.

Herhangi bir yardım

derece takdir edilecektir.

DÜZENLEME

this library teknik olarak benim değil lütfen unutmayın, bu yüzden onu değiştiremez. Orijinal deklarasyonunu değiştirmeden Swift'de kullanmanın bir yoluna ihtiyacım var. Benim örneğim sadece sorunumu basitleştirmek. Ben hiçbir başarı ile senaryolar aşağıdaki denedi

DENEMİŞ NE

:

hata

func getAxisLabel(axis: AnyObject!, Value value: CGFloat) -> String! { 
    return "" 
} 

' 'Protokolün gerektirdiği olanlardan farklı argümanlar adı olan' olanlardan farklı argümanlar adı vardır protokol 'hatası

func getAxisLabel(axis: AnyObject!, Value: CGFloat) -> String! { 
    return "" 
} 

' ty gerektirdiği pe

accepted answer

+0

Obj c büyük harf V ve hızlı küçük v ikisini de küçük olun.. Her ikisinde de küçük harf olmalı. – Fogmeister

+0

harici yöntem adı "Value" ve "value" gibi iç param adıyla hızlı bir şekilde yazmayı deneyin: "Değer değeri: CGFloat" – hola

+0

Bu sorunu çözebilir ancak ilk etapta V harfi olmamalıdır. Bırak ve işe yarayacak. – Fogmeister

cevap

9

bu bir hata olup olmadığını bilmiyorum görün protokolü'

func getAxisLabel(axis: AnyObject!, Value: CGFloat) -> NSString! { 
    return "" 
} 

ÇÖZÜM uymuyor.Amaç-Cı protokolü yöntemi

- (NSString *)getAxisLabel:(id)axis Value:(CGFloat)value; 

olarak Swift eşleştirilir (büyük harf "V" Value: içinde olan)

func getAxisLabel(axis: AnyObject!, value: CGFloat) -> String! 

arasında, ancak hiçbiri (küçük harflerle value: olarak "V") ile Protokol gereksinimini karşılamak için derleyici tarafından
func getAxisLabel(axis: AnyObject!, value: CGFloat) -> String! { } 
func getAxisLabel(axis: AnyObject!, Value: CGFloat) -> String! { } 

kabul edilir.

bir çözüm olarak, açık bir Objective-C selektör adıyla yöntemini açıklama yapabilirsiniz:

class ViewController: UIViewController, MyProtocol 
{ 
    @objc(getAxisLabel:Value:) 
    func getAxisLabel(axis: AnyObject!, value: CGFloat) -> String! { 
     return "" 
    } 
} 
+1

Sen bir hayat kurtarıcısın! Bir geçici çözüm olarak @objc anahtar kelimesiyle bir şey olması gerektiğini biliyordum, ancak tam olarak nasıl kullanılacağını bilmiyordum. Ayrıca gelecek referanslar için bilmek büyük! –

İlgili konular