自從參加工作一直在用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 }