簡體   English   中英

如何使 Swift package 可在 objective-c 項目中導入/使用?

[英]How to make a Swift package importable/usable in an objective-c project?

我有一個僅用 Swift 編寫的 package,現在我想讓它適用於 objective-c 項目。 I know usually to use Swift classes in the same target you can use the bridging header created for the module, but when I import my package through SPM, there is no prompt to create a bridging header. 這可能嗎? 我必須先以某些方式准備我的 swift package 嗎?

令人驚訝的是,網上關於此的文檔數量很少,但我終於弄明白了。 這不像在 package.Swift 文件中進行一些更改並單擊一些按鈕那么容易,但幸運的是它也不是太難。 我仍在努力使我的 Swift 庫可在 Objc 中使用,並將根據我在此過程中發現的任何發現更新此答案,但這是我目前所擁有的:

  1. Swift 中的 class 如果繼承自 NSObject,則只能在 objc 中使用
public final class MyObjcLibrary: NSObject {}
  1. 要將其導出到 objc,您需要 append @objc關鍵字,並且您可以指定 objc 代碼使用的 class 名稱,並在關鍵字后面加上括號 - 當您的 objc ZA2F2ED4F8EBC40AB9CBB4C21A 只是一個包裝時,這非常方便您對應的 Swift class 的功能:
@objc(MyLibrary)
public final class MyObjcLibrary: NSObject{}

這樣,您的庫的用戶可以編寫[MyLibrary alloc]而不是[MyObjcLibrary alloc]

  1. 現在,您可以在新的 class 中添加用戶需要使用的所有功能(使用@objc關鍵字)。 假設您有一個名為MyLibrary的 Swift class :
@objc(MyLibrary)
public final class MyObjcLibrary: NSObject{
  private var myLibrary: MyLibrary

  @objc public init() {
    myLibrary = MyLibrary()
  }

  @objc public static func doSomething(withID: String) {
    myLibrary.doSomething(withID)
  }

  @objc public static func doSomethingElse(ID: String) {
    myLibrary.doSomethingElse(ID)
  }
  ...
}
  1. To import and call your classes and functions in your objc code, you just add the package the same way you add a Swift package, through SPM, Cocoapods, etc, then in your objc class:
@import MyPackage

...

[[MyLibrary alloc] init];
[MyLibrary doSomethingWithID:@"my_id"];
[MyLibrary doSomethingElseWithID:@"my_id"];
...

注意函數是如何在 objc 中命名的——如果第一個參數不以前綴“with”開頭,它會自動添加到 objc function 簽名中,例如doSomethingElseWithID

我見過的問題:

  • 當您的 Swift 庫有更新時,有時您需要重新啟動 Xcode 並刪除您的 DerivedData 文件夾,以便使用更新的代碼重新生成橋接 header 文件。

暫無
暫無

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

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