標籤:一個 switch atom bsp 使用 target like led ftp
swift 語言出來後,可能新的項目直接使用swift來開發。但可能在過程中會遇到一些情況,某些已用OC寫好的類或封裝好的模組。不想再在swift 中再寫一次,哪就使用混編。
這個在IOS8中是同意的。
先中簡單的入手,先研究在同一個project檔案夾下混合使用的情況。
為了示範。先準備兩個類
第一個是swift語言寫的類,檔案名稱為 act.swift
1. import Foundation
2.
3. class Act : NSObject
4. {
5. func hasAct(tag:Int) -> String
6. {
7. switch (tag)
8. {
9. case 1:return "Movie"
10. case 2:return "CCTV"
11. case 3:return "Sport TV"
12. default:return "Area TV"
13. }
14. }
15.
16. init()
17. {
18. println("act constructor is called.")
19. }
20.
21. deinit
22. {
23. println("act destroyed is called.")
24. }
25. }
第二個是用OC寫的類 標頭檔為OCChannel.h ,實現檔案為OCChannel.m
標頭檔
1. #import <Foundation/Foundation.h>
2.
3. @interface OCChannel : NSObject
4.
5. @property (nonatomic,retain) NSString *ChannelName;
6.
7. - (NSString *)ChannelChange:(NSInteger) channels;
8.
9. @end
實現檔案
1. #import "OCChannel.h"
2. #import "SwiftModule-swift.h"
3.
4. @interface OCChannel()
5. {
6. Act *act; //swift的類
7. }
8. @end
9.
10. @implementation OCChannel
11.
12. - (id)init
13. {
14. if (self = [super init]) {
15. NSLog(@"OC Constructor is called.");
16. //使用Swift類
17. act = [[Act alloc]init];
18. }
19. return self;
20. }
21.
22. - (void)dealloc
23. {
24. NSLog(@"OC Destroyed is called.");
25. //[act release];//ARC not use
26. //[super dealloc];//ARC not use
27. }
28.
29. - (NSString *)ChannelChange:(NSInteger) channels
30. {
31. return [act hasAct:channels];
32. }
33.
34. @end
這個OCChannel為中引用了swift 寫的類Act 。
主要是為了示範在同一個project項目裡,swift類調用OC,同一時候OC類也調用Swift。從而形成一種混合編寫的模式。
以下是詳細步驟:
1.建立一個Swiftproject:我這裡project名為MixDemo
建好後project:
2.就是分別引入前面的兩個類,咱先一個個來。由於建的是Swift,所以,咱先以Swiftproject中引用OC檔案進行一次混編
Swift中使用OC
首先Swift中不再使用標頭檔和.m檔案的方式了。所以也不須要使用import ""來匯入標頭檔。
哪swift 怎樣能訪問到OC的類聲明的。
事實上,swift也是須要使用標頭檔進行訪問的,僅僅只是不再須要使用顯式的方式使用import進行匯入。有兩種方式來實現這個標頭檔的產生。
方式一:在一個全新的Swift,利用第一次建立提示的方式自己主動加入橋接標頭檔。
點確定這後就會產生一個以<produceName-Bridging-Header.h>的標頭檔。
建好後的project:
這裡有一個地方須要注意的就是在targets->build settings ->Object-C Bridging Header 設為哪個橋接的標頭檔就可以。
經過上述步驟。橋接檔案弄好了就能夠
盡情的把想要在swift類中調用的OC標頭檔放使用import "" 寫到這個橋接檔案裡吧。
就像:
1. //
2. // Use this file to import your target‘s public headers that you would like to expose to Swift.
3. //MixDemo/MixDemo-Bridging-Header.h
4.
5. #import "OCChannel.h"
相同的。當你知道這個swift搜尋標頭檔的關係後,就不須要再理會這個-Bridging-Header.h的檔案了。全然能夠手工建一個並取自己喜歡的名字。
如:
方式二:
建立一個標頭檔,名為:OCContainerHeader.h
好了,以上的設定後就全然滿足了Swift使用OC寫的類了。
1. import UIKit
2.
3. class ViewController: UIViewController {
4.
5. override func viewDidLoad() {
6. super.viewDidLoad()
7. // Do any additional setup after loading the view, typically from a nib.
8.
9. //調用OC類
10. var channel = OCChannel()
11. println(channel.ChannelChange(10))
12. println(channel.ChannelChange(2))
13. }
14.
15. override func didReceiveMemoryWarning() {
16. super.didReceiveMemoryWarning()
17. // Dispose of any resources that can be recreated.
18. }
19.
20.
21. }
好了以下再來看一下OC怎樣調用Swift寫的類。
(其實。假設你是一比一抄我這個DEMO,哪麼恭喜你,在以上你將編譯不通過。
由於我的OC類中引用了swfit 寫的類。所以你要想執行。就必須把哪個Act 的類凝視了才行。
)
OC怎樣調用Swift寫的類
OC要想使用,必須有標頭檔。
而swift檔案卻沒有標頭檔,所在咱們想必也須要產生一個標頭檔。
但對於OC調用swift 的標頭檔比較特殊。
因標頭檔中面的機制是自己主動產生的,在不熟悉的。不建議手寫。
哪怎樣產生這個標頭檔。(注意,系統設定的標頭檔。在project中是看不到的。)
產生步驟:
選中targets->build settings ->packing->Product Module Name 中設定模組名,這個名稱非常重要 swift 的標頭檔就是依據這個來命名的。
儘管你看圖中有這個import "SwiftModule-swift.h"但你在整個project中是找不到這個檔案的。但能夠使用CMD+ 滑鼠點擊可看這個標頭檔裡的內容。
這 樣。project中如查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下來。
就像以下:
1. import Foundation
2.
3. @objc(Act)
4.
5. class Act
6. {
7. func hasAct(tag:Int) -> String
8. {
9. switch (tag)
10. {
11. case 1:return "Movie"
12. case 2:return "CCTV"
13. case 3:return "Sport TV"
14. default:return "Area TV"
15. }
16. }
17.
18. @objc(init)//原本以為加上這個alloc就能夠找到。但不行的。。。
19. init()
20. {
21. println("act constructor is called.")
22. }
23.
24. deinit
25. {
26. println("act destroyed is called.")
27. }
28. }
可是在使用時你就會發現
act = [[Act alloc]init]; //報錯,找不到alloc。因此建議大家還是繼承NSObject.
Swift和OC混編