Swift與OC混編(二)

1、創(chuàng)建一個Swift或者是OC的工程

下面以Swift工程舉例,OC工程操作是一樣的

創(chuàng)建好的時候自動生成我們熟知的幾個文件

2、此時我們創(chuàng)建一個OC的class或者是拷貝進(jìn)來一個都會出現(xiàn)如下提示

選擇yes之后,會自動生成如下文件

這個文件是xcode自動為我們生成的Swift中使用OC的橋接文件。

Person類的實(shí)現(xiàn)如下:

此時我們就可以在Swift文件中使用OC的類了:

Swift中使用OC就結(jié)束了。

4、此時OC類中還是不能使用Swift的,我們作如下操作:

5、先創(chuàng)建一個新的Swift類,回到我們的Person類中,引入一個形如"工程名-Swift.h"的文件,OC類中就可以使用Swift內(nèi)容了。

我們可以command+Mixed_Sample-Swift.h進(jìn)去看一下:

這個文件會給我們自動生成Swift類對應(yīng)的OC編碼的文件。


6、OC與Swift間的調(diào)用

Swift 調(diào)用 OC 代碼

直接在Swift-OC-Swift-Bridging-Header.h中,寫入比如

#import "ViewController.h"

之類的import代碼,則ASwiftFile.swift就可以訪問到ViewController.h中的OC聲明了。

注意:上面Swift-OC-Swift-Bridging-Header.h中的Swift-OC-Swift是工程的名字,不同工程是不同的~~

OC 調(diào)用 Swift 代碼

直接在OC文件中添加

#import "Swift-OC-Swift-Swift.h"

即可讓該OC文件中調(diào)用Swift文件的聲明了。

注意:同樣,上面Swift-OC-Swift-Swift.h中的Swift-OC-Swift是工程的名字,不同工程是不同的~~

命名規(guī)則ProjectName-Swift.h是Xcode默認(rèn)的,這個文件是Xcode生成的,不需要我們?nèi)リP(guān)心,并且也不會出現(xiàn)在工程目錄中;這個文件中Xcode幫我們?yōu)镾wift編寫的代碼寫了一份OC的聲明,所以O(shè)C代碼引用這個文件后,就可以調(diào)用Swift編寫的代碼了。

不成功?看這里

Bridge文件位置問題

調(diào)用不成功的,多半是因?yàn)锽ridge文件的名字有問題,這時,我們在Xcode中看一下:

Swift-OC-Swift target->Build Settings->Swift Compile - General

大概樣子,如下圖所示:

操作步驟

看一看Bridge文件聲明的位置是不是正確的,不正確就改正確。

NSObject繼承問題

特別注意,查看一下Swift文件中聲明的Class是否是繼承自NSObject的。如果不是,那么ProjectName-Swift.h文件里面也不會有相應(yīng)的OC聲明出現(xiàn)的。想一想,OC的所有類都是繼承自NSObject的,如果Swift中聲明的不是繼承NSObject的類,OC如何使用?

解決掉上面的問題之后,就大功告成了~~

*-Swift.h 文件里有什么?

目前ASwiftFile.swift文件中是這樣的代碼

import Foundation

class ASwiftFile : NSObject {

? ? ? ? ? var aString: String?

? ? ? ? ? ?func function_1() -> String {

? ? ? ? ? ?return "This is function 1"

? ? ? ? ? ?}

? ? ? ? ? ?func function_2() {

? ? ? ? ? }

}

看看Swift-OC-Swift-Swift.h文件有什么,看看就好,我就只截取與ASwiftFile.swift相關(guān)的內(nèi)容吧

// Generated by Apple Swift version 3.0.1 (swiftlang-800.0.58.6 clang-800.0.42.1)

// ...... 省略非常多的內(nèi)容

SWIFT_CLASS("_TtC14Swift_OC_Swift10ASwiftFile")

@interface ASwiftFile : NSObject

@property (nonatomic, copy) NSString * _Nullable aString;

- (NSString * _Nonnull)function_1;

- (void)function_2;

- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;

@end

// ......

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

推薦閱讀更多精彩內(nèi)容

  • 前言: Swift語言出來后,可能新的項(xiàng)目直接使用Swift來開發(fā),但可能在過程中會遇到一些情況,某些已用OC寫好...
    瘋狂的電腦閱讀 2,353評論 0 9
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,252評論 4 61
  • 難以改變,改變現(xiàn)在的自己。 難以忘記。忘記過往的快樂。 難以拋開。拋開所有的煩惱。 難以修復(fù)。修復(fù)支離破碎的感情。
    柒洔小船閱讀 208評論 0 0
  • 下午的時候有簡友詢問了我這樣一個問題:“到底該如何選擇題材?在我看來,叫好不叫座是個挺大的問題。”看得出來,提出這...
    絳洞花王閱讀 666評論 40 26
  • 1. 讓孩子自己處理內(nèi)部矛盾 雖然LOUIS與ALEX相差五歲,可是打起架了,都不含糊。 一般情況下是ALEX首先...
    小H嗨皮閱讀 364評論 0 0