1、在 Objective-C 項目中使用 Swift 代碼
-
1)在 OC 項目中創建
.Swift
文件,文件中的格式為其本有的格式。 -
2)Xcode 提示是否創建 Objective-C bridging 頭文件,點擊 Yes 創建,Xcode 會自動創建一個橋接頭文件,文件名的格式是
項目名-Bridging-Header.h
。-
一般情況下,Xcode 輔助生成的橋接頭文件在編譯屬性里已經幫我們設置了引用。
-
如果沒有的話需要自己將其配置到項目中,選中項目中的 Targets => Build Setting => Swift Compiler - general => Objective-C Bridging Header 屬性,雙擊配置成
項目名/項目名-Bridging-Header.h
即可。
-
-
3)在 OC 的
.m
文件中添加頭文件#import "項目名-Swift.h"
,在此文件中直接使用.Swift
文件中的類、方法即可。-
項目名-Swift.h
這個頭文件是 Xcode 自動產生的。 -
如果不是引用外部 Swift 語言編寫的框架,不需要我們做過多配置。
-
但是如果是引用外部框架,需要我們進行配置:選中項目中的 Targets => Build Setting => Packaging => Defines Module 修改成 Yes,然后在 Build Setting => Packaging => Product Module Name,設置一個名稱,例如 SwiftInAction。特別注意的是,這個名稱不能有
-
等字符。這樣我們在 OC 的.m
文件中就可以添加SwiftInAction-Swift.h
了,這個名字是 Xcode 根據設置的模塊名自動生成的。 -
在開始的幾次編譯或者代碼調試中,可能會出錯,提示找不到這個自動生成的文件,一般對項目進行 clean 操作可以解決問題,具體是點擊 Product 菜單下的 clean 菜單項即可。
-
2、在 Swift 項目中的 Objective-C 代碼中使用 Swift 代碼
-
1)在 Swift 項目中創建 OC 的
.h
和.m
文件,文件中的格式為其本有的格式。 -
2)Xcode 提示是否創建 Objective-C bridging 頭文件,點擊 Yes 創建,Xcode 會自動創建一個橋接頭文件,文件名的格式是
項目名-Bridging-Header.h
。-
一般情況下,Xcode 輔助生成的橋接頭文件在編譯屬性里已經幫我們設置了引用。
-
如果沒有的話需要自己將其配置到項目中,選中項目中的 Targets => Build Setting => Swift Compiler - general => Objective-C Bridging Header 屬性,雙擊配置成
項目名/項目名-Bridging-Header.h
即可。
-
-
3)在此橋接頭文件中添加所創建的 OC/C 文件的引用
#import "*****.h"
。 -
4)在
.Swift
文件中每一個方法和類名前都加@objc
前綴來修飾,以便在 Objective-C 中可以訪問。 -
5)在 OC 的
.m
文件中添加頭文件#import "項目名-Swift.h"
,在此文件中直接使用.Swift
文件中的類、方法即可。-
項目名-Swift.h
這個頭文件是 Xcode 自動產生的。 -
如果不是引用外部 Swift 語言編寫的框架,不需要我們做過多配置。
-
但是如果是引用外部框架,需要我們進行配置:選中項目中的 Targets => Build Setting => Packaging => Defines Module 修改成 Yes,然后在 Build Setting => Packaging => Product Module Name,設置一個名稱,例如 SwiftInAction。特別注意的是,這個名稱不能有
-
等字符。這樣我們在 OC 的.m
文件中就可以添加SwiftInAction-Swift.h
了,這個名字是 Xcode 根據設置的模塊名自動生成的。
-
3、在 Objective-C 里使用 Swift 限制
-
1)一些 Swift 特有的類型,例如元組、泛型、類型別名、嵌套類型等,不能在 Objective-C 里使用。
-
2)不能在 Objective-C 里繼承 Swift 類型。
-
3)數據類型之間需要互相映射關聯。
- Objective-C 核心類型到 Swift 中的替代類型,例如
NSString
到String
。 - Objective-C 確定類型到 Swift 中的同等類型,例如
id
到AnyObject
。 - Objective-C 概念到 Swift 中相匹配的概念,例如
pointers
到optionals
。
- Objective-C 核心類型到 Swift 中的替代類型,例如
-
4)不能直接把 C++ 代碼導入 Swift,解決辦法是為 C++ 代碼創建一個 Objective-C 或者 C 的封裝。