[英]ObjC protocol Implementation in Swift
好的,這是個大問題。 我有一個用ObjC( this )編寫的庫。 在那里,我們有一個已定義的協議。 當我嘗試在快速文件中使用它時,我經常得到:
類型“ XXX”不符合協議“ XXX”
為簡化起見,我組成了一個測試項目-應該將其創建為Swift項目。
然后使用以下協議在內部創建ObjC頭文件(我稱其為StupidProtocol.h)(請注意,每個名稱和值都應與給定的值完全匹配,包括大寫/小寫):
@protocol MyProtocol <NSObject>
- (NSString *)getAxisLabel:(id)axis Value:(CGFloat)value;
@end
在橋接頭中:
#import "StupidProtocol.h"
然后返回Swift文件:
class ViewController: UIViewController, MyProtocol
{
func getAxisLabel(axis: AnyObject!, value: CGFloat) -> String! {
return ""
}
}
而且,即使自動完成為我完成了getAxisLabel函數,我們還是再次遇到此錯誤。
我強烈懷疑問題出在參數“ value”及其功能參數“ Value”。
任何幫助將不勝感激。
編輯
請注意, 該庫在技術上不是我的,因此我無法更改。 我需要一種在Swift中使用它而不更改其原始聲明的方法。 我的例子只是為了簡化我的問題。
我嘗試過的
我嘗試了以下方案,但均未成功:
“參數名稱與協議要求的參數不同”錯誤
func getAxisLabel(axis: AnyObject!, Value value: CGFloat) -> String! {
return ""
}
“參數名稱與協議要求的參數不同”錯誤
func getAxisLabel(axis: AnyObject!, Value: CGFloat) -> String! {
return ""
}
'類型不符合協議'
func getAxisLabel(axis: AnyObject!, Value: CGFloat) -> NSString! {
return ""
}
解
查看已接受的答案
我不知道這是否是錯誤。 Objective-C協議方法
- (NSString *)getAxisLabel:(id)axis Value:(CGFloat)value;
(在Value:
使用大寫的“ V”)映射為Swift
func getAxisLabel(axis: AnyObject!, value: CGFloat) -> String!
( value:
小寫字母“ v” :),但沒有
func getAxisLabel(axis: AnyObject!, value: CGFloat) -> String! { }
func getAxisLabel(axis: AnyObject!, Value: CGFloat) -> String! { }
被編譯器接受以滿足協議要求。
解決方法是,可以使用顯式的Objective-C選擇器名稱注釋該方法:
class ViewController: UIViewController, MyProtocol
{
@objc(getAxisLabel:Value:)
func getAxisLabel(axis: AnyObject!, value: CGFloat) -> String! {
return ""
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.