(轉)Swift與Objective-C混編

原文鏈接:http://www.lxweimin.com/p/084f2ca45007#

隨著Swift的改進及Swift開源項目劇增,越來越多的Objective-C工程開始使用Swift混編,不管是在基于Swift工程中或者Objective-C工程中,Swift和Objective-C文件都可以無縫結合。本文首先介紹下Swift與Objective-C混編的基礎;然后在第二節(jié)中,根據(jù)我實際項目中,將詳細展開Swift和Objective-C混編需要注意的一些細節(jié)。

Swift調用Objective-C

Swift調用Objective-C文件比較簡單。當在Swift工程中新建Objective-C文件或者在Objective-C工程中新建Swift文件時,Xcode會自動提示你是否創(chuàng)建bridging header橋接頭文件,點擊創(chuàng)建后Xcode會自動為你創(chuàng)建一個橋接頭文件。
如圖1-1、1-2所示,在基于Swift的SwiftProject工程中創(chuàng)建一個OCViewController時,Xcode會自動創(chuàng)建一個名為SwiftProject-Bridging-Header.h橋接頭文件。

Swift工程中自動提示是否創(chuàng)建橋接頭文件.png
Xcode自動創(chuàng)建的Swift-Bridging-Header.h橋接頭文件

當然你也可以在Building Settings中自己設置橋接頭文件(一般情況下我們會用系統(tǒng)默認生成的),如圖1-3所示:


自定義橋接頭文件

創(chuàng)建好Bridging Header文件后,在Bridging Header文件中即可import需要提供給Swift的Objective-C頭文件,Swift即可調用對應的Objective-C文件。同時Xcode可以自動生成Objective-C對應的Swift接口。如圖1-4所示,OCViewController.h對外提供了一些Public的屬性和方法,點擊Xcode generated interface后可以看到Objective-C轉換為Swift后的Public接口。

Xcode可以自動將Objective-C轉換為Swift接口

Objective-C源代碼對應的頭文件

// 宏定義
#define DefaultHeight 100.f
// 協(xié)議
NS_ASSUME_NONNULL_BEGIN
@protocol OCViewControllerDelegate <NSObject>
- (void)detailButtonDidPressed:(id)sender;
@end
@interface OCViewController : UIViewController
// 屬性
@property (nonatomic, weak) id<OCViewControllerDelegate> delegate;
@property (nonatomic, strong) NSString *testString;@property (nonatomic, strong) NSArray *testArray;
@property (nonatomic, strong, nullable) NSArray<NSString *> *testArray2;
@property (nonatomic, strong) NSNumber *testNumber;
// 方法
- (void)testMethod1;
- (BOOL)testMethod2WithParam:(NSString *)aParam;- (NSString *)testMethod3WithParam:(NSArray *)aArray;
- (nullable NSString *)testMethod4WithParam:(nullable NSArray*)aArray;
@endNS_ASSUME_NONNULL_END

轉換后對應的Swift interface文件如下

import UIKit
// 宏定義
public var DefaultHeight: Float { get }
// 協(xié)議
public protocol OCViewControllerDelegate : NSObjectProtocol {
 public func detailButtonDidPressed(sender: AnyObject)
}
public class OCViewController : UIViewController { 
// 屬性
 weak public var delegate: OCViewControllerDelegate? 
public var testString: String public var testArray: [AnyObject]
public var testArray2: [String]? 
public var testNumber: NSNumber
 // 方法
 public func testMethod1()
 public func testMethod2WithParam(aParam: String) -> Bool
 public func testMethod3WithParam(aArray: [AnyObject]) -> String
 public func testMethod4WithParam(aArray: [AnyObject]?) -> String?
}

Objective-C類、協(xié)議、屬性、方法、擴展、閉包等所有功能都可以無縫地被轉換為Swift接口被Swift文件所調用。但是還是有些特別需要注意的地方,詳細將在第二節(jié)中講到
Objective-C中為了兼容 Swift,新增了三大特性Nullability、Lightweight Generics、__kindof,詳細閱讀
構造方法
循環(huán)引用 (weak & unowned)
基礎類型轉換 (String、Array、Int)
可選類型
枚舉(NS_OPTIONS)
單例
值類型和引用類型
閉包
判等 (== 、 ===、類型判斷)
調用Objective-C第三方類庫
更多...

Objective-C調用Swift
Xcode會自動為Project生成頭文件以便在Objective-C中調用。在Objective-C類中調用Swift,只需要#import "productModuleName-Swift.h"即可調用,Xcode提供的頭文件以Swift代碼的模塊名加上-Swift.h為命名。在這個頭文件中,將包含Swift提供給Objective-C的所有接口、Appdelegate及自動生成的一些宏定義,如圖1-5所示。注意productModuleName-Swift.h在Xcode中是無法搜索查看的,只能從import中點擊進去查看。

Xcode自動生成SwiftProject-Swift.h文件

在大部分情況下,Objective-C都可以無縫地調用Swift,但是由于Swift相對于Objective-C多了一些新特性,比如泛型、元組、枚舉的等,所以Swift暴漏給Objective-C的接口多了一些限制,因此Swift只能暴露在Objective-C中有效的接口。
Swift與C交互
有時候我們在Swift中可能需要與C交互(如Core Graphics),Swift對此提供了有效的支持。
原始類型Swift提供了將Swift類型直接映射為C原始類型的“類C風格”類型。這些類型以C開頭后跟C原始類型名。例如,bool -> CBool,unsigned long long -> CUnsignedLongLong。
指針類型指針類型需要一些描述信息。例如,const void* -> CConstVoidPointer, void* -> CMutableVoidPointer或者COpaquePointer(兩者區(qū)別在于用于參數(shù)還是函數(shù)返回值)。指向某一類型的指針
類型化的指針可以用泛型語法CMutableVoidPointer<Type>,例如,Int* -> CMutableVoidPointer<Type>

Swift與C++交互
Objective-C能與C/C++很好的交互,目前Swift對C++的交互不是很好的支持(原因蘋果認為C++是個很復雜的語言,與C++的交互性需要考慮很多東西,是件很長遠的事情,至少在3.0及3.0版本之前Swift不支持),所以如果有些庫需要與C++混編可以考慮用Objective-C作為橋接。
觀點
在同一項目中同時使用Swift和Objective-C混編,意味著可用Swift的新的特性及多編程范式為Objective-C項目增加新的特性或者優(yōu)化代碼結構,也可以同時充分利用Objective-C runtime等一些黑魔法。Swift能夠與Objective-C和Cocoa框架和平共處,同時對一些C語言的基礎類型保持了兼容,Swift的兼容使得它更加強大和便利。一旦在工程中采用Swift和Objective-C混編,你完全不用擔心之前已有的Objective-C代碼和框架。下節(jié)將詳細展開Swift和Objective-C混編的一些細節(jié)詳細展開。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容