羣裏大神發的網址,感受有用就先收錄了,暫時沒時間看SWIFT,感受代碼簡潔,可是可閱讀性不是過高,有些代碼讓系統去判斷類型,一樣的,咱們看代碼的時候也得本身去判斷類型,或許看多就習慣了,有時間再說吧,swift一時半會兒也無法寫進程序裏swift
做者:fengsh998
原文地址:http://blog.csdn.net/fengsh998/article/details/34440159
轉載請註明出處
若是以爲文章對你有所幫助,請經過留言或關注微信公衆賬號fengsh998來支持我,謝謝!
swift 語言出來後,可能新的項目直接使用swift來開發,但可能在過程當中會遇到一些狀況,某些已用OC寫好的類或封裝好的模塊,不想再在swift 中再寫一次,哪就使用混編。這個在IOS8中是容許的。微信
先中簡單的入手,先研究在同一個工程目錄下混合使用的狀況。ide
爲了演示。先準備兩個類ui
第一個是swift語言寫的類,文件名爲 act.swiftthis
- 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.matom
頭文件.net
- #import
-
- @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。從而造成一種混合編寫的模式。
下面是具體步驟:code
1.新建一個Swift工程:我這裏工程名爲MixDemoblog
建好後工程:繼承
2.就是分別引入前面的兩個類,咱先一個個來。由於建的是Swift,因此,咱先以Swift工程中引用OC文件進行一次混編
Swift中使用OC
首先Swift中再也不使用頭文件和.m文件的方式了。因此也不須要使用import ""來導入頭文件。哪swift 如何能訪問到OC的類聲明的。
其實,swift也是須要使用頭文件進行訪問的,只不過再也不須要使用顯式的方式使用import進行導入。有兩種方式來實現這個頭文件的生成。
方式一:在一個全新的Swift,利用第一次新建提示的方式自動添加橋接頭文件。
點肯定這後就會生成一個以的頭文件。
建好後的工程:
這裏有一個地方須要注意的就是在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.