objective-c - with - xcode convert objective c project to swift




如何從Swift中調用Objective-C代碼 (9)

在Apple的新Swift語言中,如何調用Objective-C代碼?

Apple提到它們可以共存於一個應用程序中,但是這是否意味著可以在技術上重新使用Objective-C中製作的舊類,同時在Swift中構建新類?

推理

Objective-C是一種獨立於平台的語言,而Swift是平台依賴的。 因此,在Swift中編寫非平台相關的代碼(業務邏輯庫)不是明智之舉。 但是,編寫與平台相關的代碼(例如,相關接口)將會非常好。 並不是說這將是一個好主意,但它絕對是一種興趣。


在Swift中使用Objective-C類

**如果您有一個您想使用的現有課程,請執行步驟2 ,然後跳至步驟5 。 (對於某些情況,我必須將一個明確的#import <Foundation/Foundation.h到較舊的Objective-C文件中。)**

第1步:添加Objective-C實現 - .m

.m文件添加到您的類中,並將其命名為CustomObject.m

第2步:添加橋接頭

添加.m文件時,您可能會看到如下所示的提示:

點擊

如果您沒有看到提示,或者意外刪除了橋接頭,請在項目中添加一個新的.h文件並將其命名為<#YourProjectName#>-Bridging-Header.h您的項目名稱<#YourProjectName#>-Bridging-Header.h

在某些情況下,特別是使用Objective-C框架時,不要明確添加Objective-C類,並且Xcode無法找到鏈接器。 在這種情況下,創建如上所述命名的.h文件,然後確保在目標的項目設置中鏈接其路徑,如下所示:

注意

最好的做法是使用$(SRCROOT)宏鏈接項目,這樣如果您移動項目或使用遠程存儲庫與其他項目一起工作,它仍然可以工作。 $(SRCROOT)可以被認為是包含你的.xcodeproj文件的目錄。 它可能看起來像這樣:

$(SRCROOT)/Folder/Folder/<#YourProjectName#>-Bridging-Header.h

第3步:添加Objective-C標題 - .h

添加另一個.h文件並將其命名為CustomObject.h

第4步:構建您的Objective-C類

CustomObject.h

#import <Foundation/Foundation.h>

@interface CustomObject : NSObject

@property (strong, nonatomic) id someProperty;

- (void) someMethod;

@end

CustomObject.m

#import "CustomObject.h"

@implementation CustomObject 

- (void) someMethod {
    NSLog(@"SomeMethod Ran");
}

@end

第5步:將類添加到橋接頭

YourProject-Bridging-Header.h

#import "CustomObject.h"

第6步:使用你的對象

SomeSwiftFile.swift

var instanceOfCustomObject: CustomObject = CustomObject()
instanceOfCustomObject.someProperty = "Hello World"
println(instanceOfCustomObject.someProperty)
instanceOfCustomObject.someMethod()

沒有必要明確導入; 這就是橋接頭的作用。

在Objective-C中使用Swift類

第1步:創建新的Swift類

.swift文件添加到您的項目中,並將其命名為MySwiftObject.swift

MySwiftObject.swift

import Foundation

class MySwiftObject : NSObject {

    var someProperty: AnyObject = "Some Initializer Val"

    init() {}

    func someFunction(someArg:AnyObject) -> String {
        var returnVal = "You sent me \(someArg)"
        return returnVal
    }   
}

第2步:將Swift文件導入ObjC類

SomeRandomClass.m

#import "<#YourProjectName#>-Swift.h"

文件: <#YourProjectName#>-Swift.h您的項目<#YourProjectName#>-Swift.h應該已經在您的項目中自動創建,即使您看不到它。

第3步:使用你的班級

MySwiftObject * myOb = [MySwiftObject new];
NSLog(@"MyOb.someProperty: %@", myOb.someProperty);
myOb.someProperty = @"Hello World";
NSLog(@"MyOb.someProperty: %@", myOb.someProperty);
NSString * retString = [myOb someFunction:@"Arg"];
NSLog(@"RetString: %@", retString);

注意:

CodeCompletion的表現並不像我想要的那麼準確。 在我的系統上,使用“cmd + r”運行快速構建似乎有助於Swift找到一些Objective-C代碼,反之亦然。

2.如果將.swift文件添加到較舊的項目並出現錯誤: dyld: Library not loaded: @rpath/libswift_stdlib_core.dylib ,請嘗試完全重新啟動Xcode 。

3.儘管在Swift 2.0之後,通過使用@objc前綴在Objective-C中最初可能使用純Swift類,但這不再可能。 請參閱編輯歷史以獲取原始說明 如果此功能在未來的Swift版本中重新啟用,則答案將相應更新。


我還想再補充一點:

我非常感謝@ Logan的回答。 它有助於創建橋接文件和設置。

但是在完成所有這些步驟之後,我仍然沒有在Swift中獲得Objective-C類。

我使用了cocoapods庫並將其集成到我的項目中。 哪個是pod "pop"

因此,如果在Swift中使用Objective-C窗格,則可能有可能無法將類導入到Swift中。

你必須做的簡單事情是:

  1. 轉到<YOUR-PROJECT>-Bridging-Header文件和
  2. 將語句#import <ObjC_Framework>替換為@import ObjC_Framework

例如:(流行音樂庫)

更換

#import <pop/POP.h>

@import pop;

#import不工作時使用clang import #import


雙向使用Objective-C的方法Objective-C

1

1. Create bridge-header.h file in Xcode Project
2. import .h file in bridge-Header file
3. Set path of bridge-Header in Build settings. 
3. Clean the Project 

2

  1. Create objective-c files in project(it automatically set path in Build Settings for you )
  2. import .h file in bridge-Header file

現在很好去, 謝謝


以下是在Swift項目中使用Objective-C代碼(在這種情況下,由第三方提供的框架)的分步說明:

  1. 通過選擇File - > New - > New File - > Objective-C File, 將任何Objective-C文件添加到Swift項目中 。 保存後, Xcode會詢問您是否要添加橋接頭 。 選擇“ ”。 GIF:將空文件添加到項目並生成橋接頭http://www.derrrick.com//1-empty-file.gif

簡單步驟:

  1. 出現一個提示符,然後單擊確定...如果它沒有出現,那麼我們手動創建它,如下所示...從iOS源創建一個頭文件並給出名稱ProjectName-Bridging-Header(示例:Test -Bridging-Header),然後在Swift編譯器代碼 - > Objective-C橋添加Objective-C橋名稱(Test / Test-Bridging-Header.h)中進入編譯設置。 是的,這是完整的。

  2. 或者,刪除您添加的Objective-C文件(在上面的GIF圖像中命名為“任何”)。 你不再需要它了。

  3. 打開橋接頭文件 - 文件名的格式為[YourProject] --ridging-Header.h 。 它包含一個Xcode提供的評論。 為要包含的Objective-C文件添加一行代碼 ,例如第三方框架。 例如,要將Mixpanel添加到項目中,您需要將以下代碼行添加到橋接頭文件中:

    #import "Mixpanel.h"
  4. 現在,在任何Swift文件中,您都可以使用現有的Objective-C代碼,Swift語法 (在本例的情況下,您可以調用Mixpanel SDK方法等)。 您需要熟悉Xcode如何將Objective-C轉換為Swift。 蘋果的指南是一個快速閱讀。 或者查看一個不完整摘要的答案。

Mixpanel示例:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    Mixpanel.sharedInstanceWithToken("your-token")
    return true
}

而已!

注意: 如果從項目中刪除橋接頭文件,請務必進入“生成設置”並刪除“Swift編譯器 - 代碼生成”下的“ Objective-C橋接頭 ”的值。


你可以閱讀不錯的帖子Swift&Cocoapods 。 基本上,我們需要創建一個橋接頭文件並將所有Objective-C頭文件放在那裡。 然後我們需要從我們的構建設置中引用它。 之後,我們可以使用Objective-C代碼。

let manager = AFHTTPRequestOperationManager()
manager.GET(
  "http://example.com/resources.json",
  parameters: nil,
  success: { (operation: AFHTTPRequestOperation!,
              responseObject: AnyObject!) in
      println("JSON: " + responseObject.description)
  },
  failure: { (operation: AFHTTPRequestOperation!,
              error: NSError!) in
      println("Error: " + error.localizedDescription)
  })

還可以看看Apple的文檔Using Cocoa和Objective-C中的Swift


只要注意誰試圖向Swift添加Objective-C庫:您應該在Build Settings - > Linking - > Other Linker Flags中添加-ObjC


文檔引用:

任何可作為模塊訪問的Objective-C框架(或C庫)都可以直接導入到Swift中。 這包括所有的Objective-C系統框架(如Foundation,UIKit和SpriteKit)以及隨系統提供的通用C庫。 例如,要導入Foundation,只需將此導入語句添加到您正在使用的Swift文件的頂部:

import Foundation

該導入使所有Foundation API(包括NSDate,NSURL,NSMutableData及其所有方法,屬性和類別)都可以直接在Swift中使用。


我寫了一個簡單的Xcode 6項目,演示瞭如何混合使用C ++,Objective-C和Swift代碼:

https://github.com/romitagl/shared/tree/master/C-ObjC-Swift/Performance_Console

特別是,該示例從Swift中調用Objective-C和C ++函數

關鍵是創建一個共享頭文件Project-Bridging-Header.h,並將Objective-C頭文件放在那裡。

請下載該項目作為一個完整的例子。


點擊新建文件菜單,然後選擇文件選擇語言目標。 那時它會自動生成一個用於定義某個類名的“Objective-C橋接頭”文件。

“Swift編譯器 - 代碼生成”下的“Objective-C橋接頭”。





swift