簡體   English   中英

Swift中的ObjC協議實現

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM