oc 和 swift 混編
swift 語言出來後,可能新的專案直接使用swift來開發,但可能在過程中會遇到一些情況,某些已用OC寫好的類或封裝好的模組,不想再在swift 中再寫一次,哪就使用混編。這個在IOS8中是允許的。
先中簡單的入手,先研究在同一個工程目錄下混合使用的情況。
為了演示。先準備兩個類
第一個是swift語言寫的類,檔名為 act.swift
- import Foundation
- class Act : NSObject
- {
- func hasAct(tag:Int) -> String
- {
- switch (tag)
- {
- case 1:return"Movie"
- case 2:return"CCTV"
- case 3:return"Sport TV"
- default:return"Area TV"
- }
- }
- init()
- {
-
println("act constructor is called."
- }
- deinit
- {
- println("act destroyed is called.")
- }
- }
第二個是用OC寫的類 標頭檔案為OCChannel.h ,實現檔案為OCChannel.m
標頭檔案
- #import <Foundation/Foundation.h>
- @interface OCChannel : NSObject
- @property (nonatomic,retain) NSString *ChannelName;
-
- (NSString *)ChannelChange:(NSInteger) channels;
- @end
實現檔案
- #import "OCChannel.h"
- #import "SwiftModule-swift.h"
- @interface OCChannel()
- {
- Act *act; //swift的類
- }
- @end
- @implementation OCChannel
- - (id)init
- {
- if (self = [super init]) {
- NSLog(@"OC Constructor is called.");
- //使用Swift類
- act = [[Act alloc]init];
- }
- return self;
- }
- - (void)dealloc
- {
- NSLog(@"OC Destroyed is called.");
- //[act release];//ARC not use
- //[super dealloc];//ARC not use
- }
- - (NSString *)ChannelChange:(NSInteger) channels
- {
- return [act hasAct:channels];
- }
- @end
這個OCChannel為中引用了swift 寫的類Act 。主要是為了演示在同一個工程專案裡,swift類呼叫OC,同時OC類也呼叫Swift。從而形成一種混合編寫的模式。
下面是具體步驟:
1.新建一個Swift工程:我這裡工程名為MixDemo
建好後工程:
2.就是分別引入前面的兩個類,咱先一個個來。因為建的是Swift,所以,咱先以Swift工程中引用OC檔案進行一次混編
Swift中使用OC
首先Swift中不再使用標頭檔案和.m檔案的方式了。所以也不需要使用import ""來匯入標頭檔案。哪swift 如何能訪問到OC的類宣告的。
其實,swift也是需要使用標頭檔案進行訪問的,只不過不再需要使用顯式的方式使用import進行匯入。有兩種方式來實現這個標頭檔案的生成。
方式一:在一個全新的Swift,利用第一次新建提示的方式自動新增橋接標頭檔案。
點確定這後就會生成一個以<produceName-Bridging-Header.h>的標頭檔案。
建好後的工程:
這裡有一個地方需要注意的就是在targets->build settings ->Object-C Bridging Header 設為哪個橋接的標頭檔案即可。
經過上述步驟,橋接檔案弄好了就可以
盡情的把想要在swift類中呼叫的OC標頭檔案放使用import "" 寫到這個橋接檔案中吧。就像:
- //
- // Use this file to import your target's public headers that you would like to expose to Swift.
- //MixDemo/MixDemo-Bridging-Header.h
- #import "OCChannel.h"
同樣的,當你知道這個swift搜尋標頭檔案的關係後,就不需要再理會這個-Bridging-Header.h的檔案了。完全可以手工建一個並取自己喜歡的名字。如:
方式二:
新建一個頭檔案,名為:OCContainerHeader.h
好了,以上的設定後就完全滿足了Swift使用OC寫的類了。
- import UIKit
- class ViewController: UIViewController {
- override func viewDidLoad() {
- super.viewDidLoad()
- // Do any additional setup after loading the view, typically from a nib.
- //呼叫OC類
- var channel = OCChannel()
- println(channel.ChannelChange(10))
- println(channel.ChannelChange(2))
- }
- override func didReceiveMemoryWarning() {
- super.didReceiveMemoryWarning()
- // Dispose of any resources that can be recreated.
- }
- }
好了下面再來看一下OC如何呼叫Swift寫的類。(事實上,如果你是一比一抄我這個DEMO,哪麼恭喜你,在以上你將編譯不通過。因為我的OC類中引用了swfit 寫的類,所以你要想執行,就必須把哪個Act 的類註釋了才行。)
OC如何呼叫Swift寫的類
OC要想使用,必須有標頭檔案。而swift檔案卻沒有標頭檔案,所在咱們想必也需要產生一個頭檔案。但對於OC呼叫swift 的標頭檔案比較特殊。因標頭檔案裡面的機制是自動生成的,在不熟悉的,不建議手寫。
哪如何產生這個標頭檔案。(注意,系統設定的標頭檔案,在工程中是看不到的。)
產生步驟:
選中targets->build settings ->packing->Product Module Name 中設定模組名,這個名稱很重要 swift 的標頭檔案就是根據這個來命名的。
雖然你看圖中有這個import "SwiftModule-swift.h"但你在整個工程中是找不到這個檔案的,但可以使用CMD+ 滑鼠點選可看這個標頭檔案中的內容。
這樣,工程中如查Swift要使用OC,則把需要使用的OC類的標頭檔案,全寫在MixDemo-Bridging-Header.h裡。同樣如果OC中所使用的swift類,只需要Clean一把,再編就可以了,但不要忘了匯入SwiftModule-swift.h哦(名稱自取,但-swift.h是固定的),另外還有一個需要讀者注意的。
注:
凡是用Swift寫的類,如果不繼成自NSObject或NSObject 的派生類,哪麼編譯後將不會生成對應的轉換類。從而使得OC 中找不到相應的宣告。
如我的例子中 class Act 這樣不會被編譯到SwiftModule-swift.h中,但寫為 class Act : NSObject,就可以編譯出相應的宣告。另外可以使用@objc加以宣告,但這個還是一樣,類最好繼承NSObject下來。就像下面:
- import Foundation
- @objc(Act)
- class Act
- {
- func hasAct(tag:Int) -> String
- {
- switch (tag)
- {
- case 1:return"Movie"
- case 2:return"CCTV"
- case 3:return"Sport TV"
- default:return"Area TV"
- }
- }
- @objc(init)//原本以為加上這個alloc就可以找到,但不行的。。。
- init()
- {
- println("act constructor is called.")
- }
- deinit
- {
- println("act destroyed is called.")
- }
- }
但是在使用時你就會發現
act = [[Act alloc]init]; //報錯,找不到alloc,因此建議大家還是繼承NSObject.
好吧,今天就寫到這裡,再研究一下framework之間的混編。。。。。
相關推薦
oc 和swift混編的時候打包ipa安裝不了
contains 方法 not 三方 ref gravity mark c項目 track 做了一個oc項目。裏面實用到swift第三方,真機執行的時候是正常的
iOS 快速從OC過渡到Swift,由理論到實戰-OC和Swift混編
接上篇文章:iOS 快速從OC過渡到Swift,由理論到實戰-Swift基礎 OC和Swift混編 a. Swift 和 OC 的對映關係 Swift 相容來大部分 OC,當然還有一些 Swift 不能夠使用的,例如 OC 中的預處理指令,即巨集定義不可使用,雖
OC和swift混編包太大
關於object-c和swift混編問題,無論是在oc基礎上新增swift還是在swift上新增oc最後打出來的ipa的包都會大一到兩倍。因為這個原因可能有很多人會放棄混編,但是不用害怕,上傳iTun
oc 和 swift 混編
作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/34440159 轉載請註明出處 如果覺得文章對你有所幫助,請通過留言或關注微信公眾帳號fengsh998來支援我,謝謝! s
OC 和 Swift 混編 OC 中呼叫 Swift
1、建立一個Object-C工程:SwiftInObjectC 2、建立一個Object-C的類:SwiftLan(注意選擇) 當建立完成後,Xcode提示下面警告,會提問我們需不需要創意一個Bridge,當然我們選擇“Yes”。 這樣會在工程中看到一個
iOS開發之OC 和 Swift混編
前言 相信很多開發者在開發過程中,使用別人封裝好的三方框架,但由於三方框架的開發語言(OC或者Swift)與現有工程的開發語言不一致,導致無法直接使用,那麼對於混編來說,是不二的選擇。 Swift專案使用OC框架 1. 建立橋接檔案,一般的命名規則(專案名-Br
OC 與 swift 混編雜記
ren use rom not 編譯 lfs 內嵌 uic chan 今天使用在swift項目上使用了oc項目的一部分源代碼發現了以下問題: 1. oc 無法繼承swift類 2. oc 無法使用 純swift類 3. 帶有閉包的函數無法被oc類調用 以上問題使得 oc 使
OC與Swift混編
可能 完全 模式 -c after 產生 addition 沒有 派生 轉:原文地址:http://blog.csdn.net/fengsh998/article/details/34440159 swift 語言出來後,可能新的項目直接使用swift來開發,但可能在過程中
Objective-C 和 Swift 混編項目的小 Tips(一)
markdown nag tomat tac 發現 tps tor ips 名稱 本文主要閑聊一些 Objective-C 和 Swift 混編項目帶來的一些潛規則,希望能幫到對此感到疑惑的朋友。下面我們開始進入主題: 命名 官方 Guide 上只是簡單敘述(Usin
OC 與 Swift混編 Swift的閉包傳值到OC中
隨著Swift的日益完善,終究會取代OC的地位,就像Kotlin取代Java一樣,不是時間的問題,而是使用者願意不願意被時代淘汰的問題 首先是Swift中定義閉包 一定要注意在Swift的類前面加上@objcMembers,這樣才能在OC中引用;在引用的變數前面加上@objc
OC與swift混編(橋接)
所謂橋接就是在OC 工程中第一次建立swift檔案的時候回生成一個頭檔案(Bridging-Header.h 橋)。 這裡主要是swift 呼叫OC方法的時候引入OC檔案.h 所使用的 第一次在OC工程中建立swift檔案生成的橋 標頭檔案, 此時路徑預設已生成,不
oc與swift混編,OC呼叫swift,swift呼叫OC
1、oc工程呼叫swift-----自動建立橋接標頭檔案 建立一個oc工程: 設定Product Module Name = 工程名 建立一個swift檔案: 點選自動建立橋接標頭檔案: 設定Objective-C Bridging Header 如下圖:
初探swift語言的學習筆記九(OC與Swift混編)
作者:fengsh998原文地址:http://blog.csdn.net/fengsh998/article/details/34440159轉載請註明出處如果覺得文章對你有所幫助,請通過留言或關注微信公眾帳號fengsh998來支援我,謝謝!swift 語言出來後,可能新
OC 和C++ 混編
先說題外話,文章標題其實起的不好,在iOS的開發中,Apple建立的庫基本都是用Objective-C寫的,所以在這裡的C++指的其實是Objective-C++。首先,最最最要緊的事情,不是程式碼而是編譯器選項,在做混合編譯之前一定要把編譯器的Compile Sources As選項改為Objective
小胖說swift04--------OC與Swift混編
小知識: 1.oc和swift只能互相傳類,不能互傳常量等非class的部分2.Swift.h只能通過.m檔案引入,.h裡面要用swift的類需要申明@class 1.Swift呼叫OC 新建一個頭
iOS開發中實現OC和Swift的混編
背景: 最近又開始看了一些關於Swift的視訊、部落格、書,發現swift相對於OC使用起來更簡潔了,於是就想在原有專案中引入swift。原有的專案都是使用OC寫的,既然要在原有專案中引入swift檔案首先就要實現OC和swift的混編設定。 混編設定:
oc swift混編實踐問題總結
swift已經慢慢變得越來越讓人喜歡了。所以,我們團隊開始嘗試探索把我們龐大的專案實現oc和swift的混編。至於為什麼不直接重構,那是因為實在是時間和事實不允許,畢竟我們的APP已
Objective_C與Swift混編遇到的坑(一)
ios工程 string類 一個 前段時間 開啟 需要 .com tar 更換 swift推出已經很長一段時間了,前段時間突然想嘗試一些簡單的類用swift編寫於是便開始了混編的路程。 1.在oc代碼裏引用swift類:找了很多資料需要添加頭文件格式為 #import "P
OC和Swift中的static
OC: static關鍵字表示靜態,能夠放在區域性變數和全域性變數前面: 限定作用域:對於靜態全域性變數來說,針對某一原始檔的以static宣告的檔案級變數與函式的作用域只限於檔案內(只在檔案內可見),也即“內部連線”,因而可以用來限定變數的作
爬坑:spark專案打包報錯(java和scala混編)
專案打包:mvn clean package -DskipTests java和scala混編打包 報錯: /Users/rocky/source/work/sparktrain/src/main/scala/com/zoujc/spark/project/dao/CourseSearchC