關(guān)于Swift開發(fā)正式項目的初體驗

引子:

手中維護(hù)了一個歷史項目,該項目因為歷史原因,從設(shè)計到實現(xiàn),并不是很好.加之該項目為支線項目,在得到了老大的批準(zhǔn)后,它不幸的被我作為了試驗田...

為此,我重新開啟了一個工程,引入了AOP,MVVM,Swift等.僅僅是初體驗,并沒有特別高深的應(yīng)用以及所謂的"最佳實踐".

混編:

項目仍然以O(shè)C為主,用來編寫大量的UI代碼,原因為:一則對Swift掌握程度不如OC,二則UI代碼使得Swift無法發(fā)揮其優(yōu)勢,三則擔(dān)心Swift版本變動.
我選擇Swift作為邏輯的處理.所以首先需要做混編的支持.

在工程中新建一個Swift文件,工程會自動詢問你(僅詢問一次)是否建立一個bridge文件,選擇是,則會出現(xiàn)一個名為XXX(工程名)-Bridging-Header.h的文件


這個文件主要用于OC->Swift.即在該h文件中import的類,Swift均可以自由調(diào)用.在Build Settings中輸入Bridging進(jìn)行搜索,可以看到有一個屬性叫做
Objective-C Bridging Header,在這里可以設(shè)置XXX-Bridging-Header.h文件的路徑.


通過設(shè)置,我們可以在Swift里面調(diào)用OC的相關(guān)代碼,但是我們的目標(biāo)并沒有實現(xiàn).我們希望使用Swift進(jìn)行運(yùn)算處理,將最終的結(jié)果返回給OC(UI)加以顯示.
那么我們還需要進(jìn)行Swift->OC的橋接.

編譯帶有Swift文件的項目后,項目會生成一個XXX(項目名)-swift.h的文件,我們只需要import這個文件,即可調(diào)用所有Swift的代碼.理所當(dāng)然,我將該文件
import到了PrefixHeader.h中.BTW,XCode6新項目已經(jīng)不會初始化一個PrefixHeader文件了,需要我們手工創(chuàng)立.

到現(xiàn)在為止,我們既可以在Swift中調(diào)用OC,也可以在OC中調(diào)用Swift了.

起飛:

準(zhǔn)備工作做好了以后,就開始享受Swift帶來的快感了.

  • 它沒有mutable,只有var和let
  • 它有強(qiáng)大的?和!,不過上手挺有難度
  • 它有泛型,也同樣類似OC一般,擁有Any和AnyObject
  • 它有元組,終于可以像紅寶石一樣寫出類似于(a,b) = (b,a)的代碼了.
  • 它有強(qiáng)大的struct,強(qiáng)大的switch
  • 它有簡潔的closure,c like的block見鬼去吧...
  • 他還有更加強(qiáng)大的func以及奇奇怪怪的小東西,什么柯里化拉等等.

我用它實現(xiàn)大部分的M和VM,小部分的V,其樂無窮.例如:

正則(自定義/重載操作符):

infix operator =~{
}

func =~(lhs: String,rhs: String) -> Bool{
    let regex: NSRegularExpression = NSRegularExpression(pattern: rhs, options: NSRegularExpressionOptions.CaseInsensitive, error: nil)!
    let range: NSRange = regex.rangeOfFirstMatchInString(lhs, options: NSMatchingOptions.ReportProgress, range: NSMakeRange(0, count(lhs)))
    return range.length > 0
}

更強(qiáng)大的enum

enum SWButtonImageLoadingStatus{
    case Success(UIImage)
    case Failure(NSError?)
}

class SWImageSelectorButton: UIButton {
    var url: String = ""
    
    func loadButtonImage(url: String,handler : (status: SWButtonImageLoadingStatus) -> ()){
        SWTemplateCenter.sharedInstance().runAction("getImage", params: params, success: {
            (data) -> Void in
            if let image = UIImage(data: data as! NSData){
                let status = SWButtonImageLoadingStatus.Success(image)
                handler(status: status)
            }
            else{
                let status = SWButtonImageLoadingStatus.Failure(nil)
                handler(status: status)
            }
            }) {
                (error) -> Void in
                let status = SWButtonImageLoadingStatus.Failure(error)
                handler(status: status)
        }
    }
}

坑:

天下哪有不停的爽點.坑當(dāng)然有.

混編機(jī)制導(dǎo)致了他們的通信依賴2個文件:XXX-swift.h和XXX-Bridging-Header.h.隨著交互的越深,XXX-Bridging-Header.h文件中所引入的頭文件
會爆炸,難以管理,很是丑陋.有時候為了實現(xiàn)一個小功能,要不然引入OC的類作為全局引用,要不然自行重寫一遍.那么此時,我的選擇是...還是使用OC吧...

Swift版本變動是一個深坑.Swift還太年輕,版本變動會非常劇烈.而每一次版本變動,帶來的直接結(jié)果就是大量的編譯錯誤.需要重新修改代碼.盡管Apple會
提供遷移工具,但是,這并沒有什么用.人工檢查和修改是一定套不了的.Swift2.0發(fā)布在即,變的更成熟,更科學(xué),更美好.而我,也到時候會迎來一次全面的檢查
和修復(fù),痛并快樂著.

在混編的過程中,有部分Swift的威力無法發(fā)揮.比如方法中無法定義參數(shù)的var,inout等,因為這樣的話無法翻譯成OC.這當(dāng)然不算Swift的坑,不過也蠻遺憾的.

iOS8以下并未含有Swift庫,所以使用Swift后會把Swift相關(guān)庫也打成包并入App中.由此帶來的問題是:即使你只寫了一行Swift代碼,App也會增大8m左右,
不過新版本的iOS已經(jīng)解決.

在實際應(yīng)用中,我曾經(jīng)出現(xiàn)過偶爾的Swift調(diào)用UIKit的錯誤:同樣的代碼,得出的結(jié)果就是不一樣.換成OC重寫一遍就OK了(在做轉(zhuǎn)場動畫,實現(xiàn)UIViewControllerAnimatedTransitioning協(xié)議的時候).我雖然認(rèn)為這應(yīng)該是我對Swift了解不足的原因,但是Swift還是給我造成了一定的困惑.

結(jié)語:

Swift具備先進(jìn)的語法,現(xiàn)代化語言的特征,蘋果爸爸的運(yùn)營,相信有著非常光明的前途.加之2.0即將到來并開源,一反蘋果封閉的常態(tài),野心也是極大的.目前使用Swift開發(fā)項目,雖然有一定的風(fēng)險,有版本變動帶來的額外工作量,但是跟隨一門語言的演化,也算是值了.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市许昨,隨后出現(xiàn)的幾起案子如绸,更是在濱河造成了極大的恐慌步藕,老刑警劉巖刽沾,帶你破解...
    沈念sama閱讀 222,946評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡搁宾,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評論 3 399
  • 文/潘曉璐 我一進(jìn)店門倔幼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盖腿,“玉大人,你說我怎么就攤上這事损同◆娓” “怎么了?”我有些...
    開封第一講書人閱讀 169,716評論 0 364
  • 文/不壞的土叔 我叫張陵膏燃,是天一觀的道長茂卦。 經(jīng)常有香客問我,道長组哩,這世上最難降的妖魔是什么等龙? 我笑而不...
    開封第一講書人閱讀 60,222評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮伶贰,結(jié)果婚禮上蛛砰,老公的妹妹穿的比我還像新娘。我一直安慰自己黍衙,他們只是感情好泥畅,可當(dāng)我...
    茶點故事閱讀 69,223評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著们豌,像睡著了一般涯捻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上望迎,一...
    開封第一講書人閱讀 52,807評論 1 314
  • 那天障癌,我揣著相機(jī)與錄音,去河邊找鬼辩尊。 笑死涛浙,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的摄欲。 我是一名探鬼主播轿亮,決...
    沈念sama閱讀 41,235評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼胸墙!你這毒婦竟也來了我注?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,189評論 0 277
  • 序言:老撾萬榮一對情侶失蹤迟隅,失蹤者是張志新(化名)和其女友劉穎但骨,沒想到半個月后励七,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,712評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡奔缠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,775評論 3 343
  • 正文 我和宋清朗相戀三年掠抬,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片校哎。...
    茶點故事閱讀 40,926評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡两波,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出闷哆,到底是詐尸還是另有隱情腰奋,我是刑警寧澤,帶...
    沈念sama閱讀 36,580評論 5 351
  • 正文 年R本政府宣布抱怔,位于F島的核電站氛堕,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏野蝇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,259評論 3 336
  • 文/蒙蒙 一括儒、第九天 我趴在偏房一處隱蔽的房頂上張望绕沈。 院中可真熱鬧,春花似錦帮寻、人聲如沸乍狐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,750評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽浅蚪。三九已至,卻和暖如春烫罩,著一層夾襖步出監(jiān)牢的瞬間惜傲,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,867評論 1 274
  • 我被黑心中介騙來泰國打工贝攒, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留盗誊,地道東北人。 一個月前我還...
    沈念sama閱讀 49,368評論 3 379
  • 正文 我出身青樓隘弊,卻偏偏與公主長得像哈踱,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子梨熙,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,930評論 2 361

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

  • 嚴(yán)格意義上說咽扇,這是干得時間最長的工作邪财。我第一份工作只干了2年就沒干了陕壹。第一份工作太辛苦,苦力活卧蜓。我現(xiàn)在想來帐要,我還是...
    樂無彩閱讀 192評論 0 0
  • 因為圖片有些模糊榨惠,加了個濾鏡看的更加清楚。先把人物畫好盛霎,用硫磺紙描下來赠橙,正反面都要描,硫磺紙正面朝上愤炸,然后拿一元硬...
    糖糖醬閱讀 514評論 0 2
  • 《士兵突擊》里面許三多有句很經(jīng)典的臺詞:自由的味道期揪,硬的。帶著柏油和輪胎的味道规个》镅Γ可以想去哪里就去哪里,想做什么就做...
    我也可以瘋狂閱讀 285評論 0 0
  • 一見如故的詩》 T恤配短褲 太守跟將軍 失落失望失掉 ???
    Andorra閱讀 255評論 0 0