簡體   English   中英

關於在Swift中采用Objective-C協議的困惑

[英]Confusion about adopting Objective-C protocols in Swift

我對Swift比較新,但在Objective-C方面經驗豐富。

我正處於將Swift集成到現有基於Objective-C的應用程序的開始階段。 我在Swift中編寫了一個類來模仿我們現有類之一的行為。 在新的Swift類中,我實現了一個用Obj-C編寫的協議。

在協議中,有一個必需的方法定義如下:

-(NSString*)getWName;

在我的Swift類中,我實現了如下:

func getWName() -> String! {
    return "some string"
}

方法簽名是XCode代碼完成產生的。 所以這是我的問題:在Swift String中不是一個對象,但是NSString是。 如果我用NSString而不是String替換此方法的返回類型,我的Swift類不再符合協議,我得到一個錯誤。

正如我所說,我對Swift相當新,並試圖圍繞其中的一些概念。 任何人都可以澄清這個嗎?

Obj-C中的基本對象也與Swift中的對象相同。 它們之間是無縫橋接的。 來自Apple docs for String:

Swift自動在String類型和NSString類之間架起橋梁。 這意味着在使用NSString對象的任何地方,您都可以使用Swift String類型,並獲得String類型的插值和Swift設計的API以及NSString類的廣泛功能。 因此,您幾乎不需要在自己的代碼中直接使用NSString類。 實際上,當Swift導入Objective-C API時,它會用String類型替換所有NSString類型。 當您的Objective-C代碼使用Swift類時,導入器會在導入的API中使用NSString替換所有String類型。

現在回答你關於為什么它實際上不起作用的問題,請多讀一段:

要啟用字符串橋接,只需導入Foundation。 例如,您可以在Swift字符串上訪問NSString類上的capitalizedString-a屬性,Swift會自動將Swift String橋接到NSString對象並訪問該屬性。 該屬性甚至返回Swift String類型,因為它在導入期間被轉換。

主要問題是在導入期間,它實際上在內部更改了該數據類型,因此定義從 - > NSString更改為String。 然后Analyzer會認為您的數據類型不匹配。

通常,使用舊數據類型沒有任何好處。 我使用NSString已經有一段時間了,因為在早期版本的swift中,String對象上基於字符的操作存在問題,但是現在已經解決了。

如果你真的需要使用它,你可以強制進行類型轉換:

let myNSString = myString as! NSString

您可以在此處詳細了解數據類型 希望能幫助到你!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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