Swift程式設計權威指南第2版 讀後收穫

滴水微瀾發表於2018-08-14
  自從參加工作一直在用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
}

 

相關文章