學(xué)習(xí)swift心得和總結(jié)

Swift

一、Swift趨勢(shì)

雖然還處于過渡時(shí)期,但趨勢(shì)很明朗了,Swift 必然會(huì)替代 Objective-C,并且比想象中來得快。現(xiàn)在就應(yīng)該做好準(zhǔn)備了。假如之前已經(jīng)掌握了 Objective-C,切換到 Swift 也不難。Swift 中很多概念在 Objective-C 中已經(jīng)存在。隨著時(shí)間推移,Swift 在整個(gè) iOS/Mac 工程中占的代碼比例會(huì)越來越多,而 Objective-C 作為粘合層還是會(huì)存在。

二、Swift優(yōu)缺點(diǎn)

用Swift的經(jīng)驗(yàn)尚淺,所以都是一些比較淺薄的理解,后面有更深刻的理解再補(bǔ)上。

優(yōu)點(diǎn):

  1. 代碼簡(jiǎn)潔。類的聲明和實(shí)現(xiàn)在一個(gè)文件中。
  • 統(tǒng)一對(duì)屬性和方法的調(diào)用,都用.。
  • 如果不加額外的訪問控制,所有的符號(hào)都是整個(gè)項(xiàng)目可見,無需考慮頭文件的問題。
  1. 結(jié)合playground,做到真正意義上的所見即所得
  2. 字符串處理太方便了。
//字符串比較和拼接實(shí)在是太方便了
let foo = "abc"
let bar = "abc"

if foo == bar {
   //blablabla
}

print("====\(foo)+\(bar)")

  1. 語言上支持延遲加載。
lazy var imageView : UIImageView = {
   var imageView = UIImageView(image: UIImage(named: "empty_hint"))
   imageView.contentMode = .ScaleAspectFit

   return imageView
}()

lazy var infoLabel : UILabel = {
   var infoLabel = UILabel()
   infoLabel.lineBreakMode = .ByWordWrapping //支持換行
   infoLabel.numberOfLines = 0

   return infoLabel
}()

lazy var button : UIButton = {
   var button = UIButton()
   button.titleLabel?.font = UIFont.systemFontOfSize(15)
   button.setTitleColor(UIColor.darkGrayColor(), forState: .Normal)
   button.setBackgroundImage(UIImage(named: "buy_instance_hint_button"), forState: .Normal)
   button.hidden = true

   return button
}()

  1. 多返回值。比如下面這個(gè)函數(shù),如果使用Objective-C寫還是比較麻煩的。
//將 "創(chuàng)建中&#FA8C35" 翻譯成對(duì)應(yīng)的 "(字符串對(duì)象, 顏色對(duì)象)"
func YWSTranslateRichText (str : String) -> (text : String, color : UIColor) {
   let statusArray = str.componentsSeparatedByString("&")

   if statusArray.count == 0 {
       return ("", UIColor.lightGrayColor())
   }

   if statusArray.count == 1 {
       return (statusArray[0], UIColor.lightGrayColor())
   }

   return (statusArray[0], UIColor.fromHexString(statusArray[1]))
}

//使用方式如下
let (text, color) = YWSTranslateRichText(instanceStatusConf)
  • 支持字符串作為枚舉值。
enum YWSECSInstanceStatus : String {
   case Starting = "Starting"
   case Running = "Running"
   case Stopping = "Stopping"
   case Stopped = "Stopped"
}

//使用方法
cell.ECSInstanceStatus = YWSECSInstanceStatus(rawValue: instanceStatus!)

//轉(zhuǎn)換成字符串
textDetailLabel.text = YWSECSInstanceStatus.Starting.rawValue

缺點(diǎn):

  • Swift靈活性非常大,既能用OP,又能用OO,語法寫法還比較多樣化,所以團(tuán)隊(duì)項(xiàng)目合作中必須注意,盡量能統(tǒng)一風(fēng)格,否則會(huì)導(dǎo)致一片亂~
  • Optional讓人頭疼,大量的?和!,沒處理好很容易導(dǎo)致崩潰。
  • 強(qiáng)類型和Optional,給JSON解析帶來了災(zāi)難。
  • 目前Xcode不支持對(duì)Swift寫的代碼做重構(gòu)。
  • Build Settings里面設(shè)置Treat Warnings as Errors對(duì)Swift代碼無效。
  • Swift不支持宏,OC里面比較常用的宏,比如下面這個(gè)UIColorFromRGB就沒法用了。
#define UIColorFromRGB(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0]
  • 不支持與C++混編,必須通過OC包一下C++的接口,Swift才能使用。使用一些跨端的C++庫(kù)(OpenGL、全文搜索、網(wǎng)絡(luò)底層等)比較麻煩。
  • Swift的錯(cuò)誤信息非常不準(zhǔn)確,難以準(zhǔn)確定位

  • 用private修飾的類,如果使用KVC來給屬性設(shè)置值,編譯不會(huì)報(bào)錯(cuò),運(yùn)行時(shí)也不會(huì)報(bào)錯(cuò),但就是設(shè)置不上。去掉private就好了。
  • Swift和OC混著寫的時(shí)候,有時(shí)候會(huì)出現(xiàn)OC的類在CloudConsoleApp-Bridging-Header.h里面提供給Swift使用,但是這個(gè)類又需要引入CloudConsoleApp-Swift.h使用Swift的一些功能,這樣就循環(huán)包含了,沒法玩下去了。

Swift代碼規(guī)范指南

三、資源整理

1.蘋果官方資源

  1. 蘋果官方為開發(fā)者提供的Swfit學(xué)習(xí)資源:https://developer.apple.com/swift/resources/

    14998280519388.jpg

    • 《The Swift Programming Language》中文版 | PDF版
      對(duì)Swift的各個(gè)特性都做了詳細(xì)的說明,是Swift的官方權(quán)威解釋

    • 《Using Swift with Cocoa and Objective-C》中文版
      介紹了Swift和OC如何互相調(diào)用和一些需要注意的地方
      中文手冊(cè):

  1. Swfit的官方網(wǎng)站:https://swift.org
    這里會(huì)介紹Swift的開源階段成果和一些使用指導(dǎo),Swift的官方博客和Swift的一些動(dòng)向信息可以在這里看到

    14998282182999.jpg

  2. Github上的官方資源是swift-evolution
    可以在這個(gè)庫(kù)里看到Swift的最新進(jìn)度。因?yàn)镾wift是一門開源的語言,你可以在這里按照一定格式提出改進(jìn)的建議。

    14998284728990.jpg

2. 第三方資源

這份指南匯集了Swift語言主流學(xué)習(xí)資源,并以開發(fā)者的視角整理編排。http://dev.swiftguide.cn

這個(gè)倉(cāng)庫(kù)“匯集了Swift語言主流學(xué)習(xí)資源,并以開發(fā)者的視角整理編排”。不得不說整理的非常的用心,也很全面。美中不足的是對(duì)于一個(gè)剛?cè)腴T的開發(fā)者忽然看到收集的這么多資源可能會(huì)不知從何下手。需要好好找出一些適合自己的資源。


14998290319120.jpg

從開發(fā)者角度介紹被廣泛運(yùn)用于實(shí)際Swift項(xiàng)目中的開源庫(kù)。

這個(gè)倉(cāng)庫(kù)篩選了被廣泛應(yīng)用在Swift項(xiàng)目中的優(yōu)質(zhì)開源庫(kù)。并且嘗試整理一些這些流行的庫(kù)的相關(guān)資源。如果你打算用Swift開發(fā)一個(gè)實(shí)際項(xiàng)目,希望這個(gè)倉(cāng)庫(kù)里收集的庫(kù)會(huì)對(duì)你有參考意義。


14998292881840.jpg
  • 還有一個(gè)值得一提的是SwiftGG翻譯組:http://swift.gg 。定期會(huì)翻譯Swift的相關(guān)文章,對(duì)于日常的學(xué)習(xí)精進(jìn)也很有幫助。
    14998295823327.jpg

視頻

  • 斯坦福課程Stanford University: Developing iOS 8 Apps with Swift(中文字幕版 By @網(wǎng)易公開課)
    14998416372889.jpg

書籍

推薦objccn出版的幾本書:《Swift開發(fā)者必備Tips》、《函數(shù)式Swift》、《Swift進(jìn)階》。這幾本書都很有很高的質(zhì)量,對(duì)于提高對(duì)Swift的掌握很有幫助。


14998296960300.jpg

14998297218773.jpg

優(yōu)秀Swift開發(fā)者推薦

如果你還使用微博的話我有幾個(gè)優(yōu)秀的Swift開發(fā)者推薦給你:

  • @StackOverflowError,被apple多次推薦的pin的開發(fā)者。知乎專欄地址:https://zhuanlan.zhihu.com/cocoanotes

  • @an00na,微博著名第三方客戶端墨客開發(fā)者。

  • @圖拉鼎,獨(dú)立開發(fā)者。iOS 作品:@奇點(diǎn)微博客戶端。

  • @沒故事的卓同學(xué)

優(yōu)秀網(wǎng)站推薦

  1. 輔助將舊的 Objective-C 代碼轉(zhuǎn)成 Swift Swiftify | Objective-C to Swift Converter
    14998428932894.jpg
  2. swiftmi
    致力于打造一個(gè)國(guó)內(nèi)專業(yè)的Apple Swift交流和分享地方
    14998450192866.jpg

四、項(xiàng)目實(shí)戰(zhàn)之混編

簡(jiǎn)介


  1. 混編無非兩種情況:

    • 在Objective - C工程或者文件使用Swift的文件
    • 在Swift工程或者文件使用Objective - C文件
  2. 在混編的過程中最重要的兩個(gè)文件:

    • 橋接文件:
      橋接文件ProjectName-Bridging-Header.h,在首次創(chuàng)建其他文件的時(shí)候,會(huì)自動(dòng)生成。如果不小心刪除后,也可以手動(dòng)添加,不過名字必須是工程名-Bridging-Header.h,如果名字記不清也可以自己新建Header file后,在Targets-->Build Settings-->Swift Compiler - General-->Objective-C Bridging Header配置文件路徑,這個(gè)文件主要是Swift使用OC類時(shí)使用。

    • Objective-C Generated Interface Header Name文件
      這個(gè)文件是混編時(shí),系統(tǒng)生成的Swift文件對(duì)應(yīng)的Objective-C的頭文件,具體可以在Targets-->Build Settings-->Swift Compiler - General-->Objective-C Generated Interface Header Name進(jìn)行配置,默認(rèn)文件名是工程名-Swift.h,一般不做改動(dòng)。

使用


  • Swift使用Objective-C

這種情況占絕大多數(shù)。只需要在ProjectName-Bridging-Header.h這個(gè)頭文件中包含相關(guān)的頭文件就行。

pod組件另外一種引入的方式是通過#import引入。
比如SDWebImage可以通過下面兩種方式引入。

//在Bridging頭文件包含下面這個(gè)頭文件
#import <SDWebImage/UIImageView+WebCache.h>

//另外一種辦法,在Swift文件中引入。
import SDWebImage

Objective-C寫的類和方法都會(huì)被改成Swift的使用方式,下面是兩個(gè)很典型的例子。使用的時(shí)候需要嘗試一下才能找到翻譯的Swift方法。

//Objective-C
titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
titleLabel.numberOfLines = 0;

//Swift
cell.nameLabel?.lineBreakMode = .ByWordWrapping //全寫是 NSLineBreakMode.ByWordWrapping
cell.nameLabel?.numberOfLines = 0

//Objective-C
UIImage *image = [UIImage imageNamed:@"abc"];

//Swift
let image = UIImage(named: "abc")
  • Objective-C使用Swift

當(dāng)在OC文件中調(diào)用Swift文件中的類的時(shí)候,首先在OC文件中要加上 #import "ProjectName-swift.h"

這個(gè)文件雖然在工程中看不到,但是它真實(shí)存在,編譯后,你可以按住Command+單擊該文件名,就會(huì)看到具體生成的代碼。
引入后,具體類的使用,直接按照OC的方式使用即可

混編注意事項(xiàng)


  1. 對(duì)于需要混編的Swift類添加@objc聲明或繼承NSObject或NSObject的子類
class TestClass
{
// 屬性
// 實(shí)現(xiàn)
}

如果要在Objective-C類中使用TestClass類,應(yīng)當(dāng)使用@objc加以聲明,或者將TestClass繼承自NSObject或NSObject的子類,否則,引入ProductName-Swift.h之后,程序找不到對(duì)應(yīng)類。

  1. 使用第三方Framework
    設(shè)置: target-->build setting -->Packaging -->Defines Module為 “Yes”;
    然后,配置文件Target -> Build Phases -> Link Binary,添加要導(dǎo)入的Framework;
    最后,還是要配置橋接文件,比如要使用 abc-lib.framework庫(kù)中的 abc.h 就要這樣配置:#import"abc-lib/abc.h";
    Subclass子類問題

  2. 對(duì)于自定義的類而言,Objective-C的類,不能繼承自Swift的類,即要混編的OC類不能是Swift類的子類。反過來,需要混編的Swift類可以繼承自O(shè)C的類。 注解

  3. OC宏文件
    如Swift文件要使用OC中定義的宏,只能使用常量簡(jiǎn)單宏文件。

  1. Swift中使用OC的block

Swift 2.* :Swift中使用閉包Closure不能使用Block作為屬性進(jìn)行傳值,必須是初始化方法或函數(shù)。

Objective-C文件中:

typedef void (^Myblock)(NSString *arg); 

@interface FirViewController : UIViewController 

@property (copy, nonatomic) Myblock myBlock; 
//Swift 2.*版本,這種作為公共參數(shù)的形式,如果在Swift類中去回調(diào)的話,是有問題的。提示沒有初始化方法,所以使用下面的以Block為參數(shù)的方法 

- (void)transValue:(Myblock) block

@end

下面是.m文件

- (void)transValue:(Myblock)block{ 
    if (block) { 
       block(@"firBack"); 
    } 
} 

在Swift文件回調(diào):

@IBAction func goFirstAction(sender: AnyObject) { 
       let firVC:FirViewController = FirViewController() 
       firVC. transValue { ( arg:String !) -> Void in 
           self.aBtn?.setTitle(arg, forState: UIControlState.Normal)
       } 
       self.navigationController?.pushViewController(firVC, animated: true) 
   }

經(jīng)測(cè)試現(xiàn)在swift版本已經(jīng)支持

firVC?.myBlock = { (arg) -> Void in
      //....  
}

五、問題解答

1. 那是不是 Objective-C 就不需要學(xué)習(xí)呢?

并非如此。Swift 還沒有很好地解決好跟 C 和 C++ 混編的問題。很多項(xiàng)目底層核心庫(kù)會(huì)采用 C/C++,界面和大部分邏輯采用 Swift 編寫,需要 Objective-C 作為粘合層。另外還存留很多庫(kù)是用 Objective-C 編寫的,使用這些庫(kù)需要一定 Objective-C 知識(shí)。

2. 為什么要選擇swift?

  • 很多人現(xiàn)在還沒有學(xué)習(xí) Swift, 覺得它沒有什么優(yōu)點(diǎn),只是一個(gè)語言大雜燴。只是等你真正使用 Swift 編寫一兩個(gè)項(xiàng)目,就回不了頭。Swift 有些簡(jiǎn)便快速的寫法,在 Objective-C 中是沒有辦法做到的。并且 Swift 的一些語言特性避免了很多 Objective-C 的坑。使用 Swift 編寫的任何功能,使用 Objective-C 也可以做到,但是會(huì)麻煩得多。而假如太麻煩的話,明知道是好的,也不會(huì)去做。

  • 很多事情,你還沒有見識(shí)過的時(shí)候,會(huì)覺得不需要。但等你真正接觸過了,就難以忍受再次失去了。比如幾年前項(xiàng)目還沒有采用 ARC。現(xiàn)在看來假如沒有 ARC,代碼寫起來太麻煩了,那時(shí)還沒有更先進(jìn)的寫法,根本不會(huì)有這樣的感覺。Swift 比 Objective-C 先進(jìn)。現(xiàn)在 Swift 還不穩(wěn)定,語言、庫(kù)、相關(guān)工具將會(huì)快速變動(dòng),而這恰好說明它在發(fā)展。

3. 公司項(xiàng)目開發(fā)怎么選擇

很多大公司為求穩(wěn),會(huì)仍然采用 Objective-C。而個(gè)人開發(fā)者和小團(tuán)隊(duì),新項(xiàng)目應(yīng)該直接采用 Swift 編寫,舊項(xiàng)目的新模塊也應(yīng)該使用 Swift 編寫。這樣慢慢將整個(gè)語言重心從 Objective-C 切換到 Swift。Swift 的代碼更簡(jiǎn)潔,開發(fā)效率更高。原有 Objective-C 項(xiàng)目,已經(jīng)使用 Objective-C 編寫的比較穩(wěn)定的庫(kù),不需要也不建議要用 Swift 重新編寫,直接混編,讓它慢慢過渡就行了。大公司傾向于不犯錯(cuò),求穩(wěn)。 個(gè)人開發(fā)者和小團(tuán)隊(duì),求穩(wěn)一定不能跟大公司競(jìng)爭(zhēng)的,更應(yīng)該求好求變。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,156評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,401評(píng)論 3 415
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,069評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,873評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,635評(píng)論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,128評(píng)論 1 323
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,203評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,365評(píng)論 0 288
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,881評(píng)論 1 334
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,733評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,935評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,475評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,172評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,582評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,821評(píng)論 1 282
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,595評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,908評(píng)論 2 372

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,151評(píng)論 4 61
  • 人之中年,父母子女一家老小,辛苦是自然的事情,也是最能懂得親情溫暖的時(shí)期了。 所謂父母子女一場(chǎng),就是我看著你的背影...
    余罪說閱讀 333評(píng)論 0 2
  • 無盡的原野, 踩著天的鞋, 不停地向遠(yuǎn)處奔跑著, 殊不知,身后已是滿眼看不完的綠海, 也許這就是愛情的力量吧。
    我是小香菇閱讀 216評(píng)論 0 0
  • 你有沒有得過一種病,這個(gè)病叫做舍不得丟東西。 我承認(rèn),我有這個(gè)病,而且還沒好。 有一部紀(jì)錄片叫《三百六十五天的簡(jiǎn)單...
    Nikkibetter閱讀 399評(píng)論 0 0
  • It is not necessary to travel to other places to learn ab...
    西西Stella閱讀 137評(píng)論 0 0