自從參加工作一直在用OC做iOS開發。在2015年的時候蘋果剛推出swift1.0不久,當時畢竟是新推出的語言,大家也都很有激情的學習。不過在學完後發現很難在實際項目中使用,再加上當時公司項目都是基於OC來做的開發,就把swift放一邊了。 後來也不斷看到網上對swift的各種評價,有好有壞,總之是一門剛推出的語言吧。文法設計,與OC無縫銜接等存在一些問題還是可以接受的。 自從2017年9月蘋果推出swift4.0後,基本大的文法變動沒有了。慢慢的有很多公司開始使用swift開發公司項目了。這也說明swift已經穩定的可以解決實際項目問題了。 2018年因為工作變動,入職現在的公司。公司的項目是大部分基於swift開發,少量使用OC。這個時候我感覺需要系統學習下swift了。在網上搜了搜有沒有比較好的swift書籍。看了很多評價發現《Swift編程權威指南》無論從入門難度還是講解方式都挺適合我的。索性就選它了。我是用kindle看的。時間是在上下班的地鐵上和下班後的休息時間。前後用時一個月左右。 閱讀這本書對我的感受還是挺多的。索性把讀完的感受寫下來。因為人的記憶力太弱了,一星期忘一半,二星期忘七成。我怕不寫下來。半年後我基本上不記得說了都是講什麼了。 這裡講的基本上是與OC的對比,還後後面三章的三個項目作者的開發方式對我目前開發方式的反思。
一、swift對比OC來說它要表達的哲學是:安全,簡潔。這兩點在平時的編程中無處不在,舉個例子:
classDog: NSObject{ letorigin: String= "中國" fileprivatevarname: String? privatevarage: Int? init(_name: String?, age: Int= 1) { self.name= name ?? "旺財" self.age= age }}
定義了一個Dog類,一個常量“origin”,當一個變數被定義成let型,則只能被賦值一次。“name”和”age”是兩個可空類型的變數。重載了一個init方法,在init方法中有兩個形參。“name”為可空類型,”age”的預設值為一。在init方法中將這兩個變數賦值給屬性。其中判斷name有值就設定name,為空白時設定預設值“旺財”。
定義一個類只需這麼幾行代碼,相比OC簡潔了很多。安全上:顯示標識出哪些變數可空,哪些變數不可修改。即提高了效能,又提高了安全性。
2.OC中的block代碼塊被swift中的閉包替代在swift中,函數也是一等公民,同基本類型一樣。可以做屬性,函數參數,傳回值自由使用。其定義方式同OC區別很大,如:swift定義與OC的定義
let sum: ((Int,Int) -> Int) = {(a, b) in returna + b } let res = sum(1, 2) print(res) int(^SumBlock) (int, int) = ^(intx, inty) { return x + y; };
3.字串使用的區別對於平時使用較多的字串處理,變化還是比較大的。
let str = "hello world"var str0 = str.prefix(2)//前兩個var str1 = str.suffix(2)//後兩個 let index0 = str.index(str.endIndex, offsetBy: -4)var str2 = str[index0..<str.endIndex]//後4個 let index1 = str.index(str.startIndex, offsetBy: 4)var str3 = str[str.startIndex..<index1]//前4個
與OC的對比
NSString*str = @"hello world"; id str0 = [str substringToIndex:2]; id str1 = [str substringFromIndex:str.length-2]; id str2 = [str substringWithRange:NSMakeRange(2, 3)];
4.在swift中,結構體的使用非常廣泛,它的作用和用法與類相似,主要區別是結構體不能被繼承。所以考慮到如果類型不會被繼承產生子類,都可以使用結構體替換。此外結構體嵌套也是swift與OC相比變化較大的部分。
struct Animal { let region = "中國" var name: String? var color = UIColor.red init(name: String,color: UIColor) { self.name= name self.color= color } struct Dog { let legNum = 4 func run() -> String{ return"跑回家" } }}
5.枚舉。swift提供的枚舉比OC強大太多。枚舉中可以繼續定義枚舉,結構體,類,方法。非常靈活。
enum SDCEnumType: Int{ case circle = 20 case check func enumTypeString(type: SDCEnumType) -> String{ switch type { case .circle: return"circle" default: if type.rawValue== 21{ return"check" } else{ return"其他情況" } } } enum SDCEnumSubType { case square(SDCEnumType) case ellipse(SDCEnumType) }}
6.swift提供的協議也是非常的靈活,可以進行協議擴充,協議繼承,定於初始化方法,協議關聯等。
protocol Student { var name: String{getset} var age: Int{get} static func study(date:Date) -> Date init(name:String)}extension Student{ var score:Float{ return80.8 } }protocol Childe:Student{ }
7.後面的Mac,iPhone,OC與Swift混合項目讓我對編程過程的理解:1.平時很少關注Mac程式開發,這本書在後面的例子中寫了一個Mac應用的demo。算是對Mac應用有了一定的認識。2.編程步驟分兩步:一,實現功能。二,進行設計模式調整。這個兩個步驟在平時的編程中,我只是進行代碼實現,對於完成功能後的設計模式最佳化卻沒有做。想想工作了這麼久,編程都是只走了一半,真是汗顏。
8.範型的使用。在OC中範型常用的情境是對集合內容的限制,而在swift中,範型已經涉及到函數。這樣瞬間使函數的戰鬥力增加了10倍。swift是強型別語言,同一個運算子兩邊的類型必須是一致的。
func SwapTwoValues <T> (inout a: T,inout b :T){ let tempValue = a a = b b = tempValue} structIntStack{ var items = [Int]() //壓棧 mutating func push(item:Int){ items.append(item) } //出棧 mutating func pop()->Int{ return items.removeLast() }} struct Stack<Ele>{ var items = [Ele]() mutating func push(item:Ele){ items.append(item) } mutating func pop()->Ele{ return items.removeLast() }}
9.在swift中,每個運算子其實也是一個函數。這個與OC比起來有著概念性的差別。
//前置運算子,表示2的var0次方prefix operator ^prefix func^ ( var0: Double) -> Double{ return pow(2, var0)}//後置運算子,表示var0的2次方postfix operator ^postfix func ^ (var0: Double) -> Double{ return var0*var0}