關(guān)于swift的個人小結(jié)
寫在前面
接觸swift也有段時間了,通過這段時間自己接觸和借鑒別人的經(jīng)驗,記錄幾點關(guān)于swift的小技巧,雖然不是什么高深的原理知識,但是在平常的項目中用到或許可以提高開發(fā)效率呢
🙃,哈哈,接下來就簡單總結(jié)一下:
枚舉(ENUM)
結(jié)合一個小場景, 比如我們要做一個關(guān)于性別判斷的一個小case:
可能我們首先想到的就是這樣,硬編碼寫入,每次都需要手動輸入
var gender = "" gender = "man" switch gender { case "man": print("man") case "female": print("female") default: print("other") }
但是如果我們利用枚舉來寫的話:
enum Gender { case man case female case other } var gType: Gender = .man switch gType { case .man: print("男性") case .female: print("女性") case .other: print("其他類型") default: print("我也不知道") }
把需要的類型寫到enum 中,就會減少不小心輸入錯誤的幾率,而且不在enum范圍中的實例,編輯器也會指出。
空合運算符
比如我們要定義某個label的默認(rèn)text, 也就是說,如果我們沒有去人為設(shè)置,這個label就會用默認(rèn)text顯示,我們可能會這么寫:
var customText: String? var defaultText = "您好" var textToUse = "" if let text = customText { textToUse = text } else { textToUse = defaultText }
如果換種簡單的寫法就成了這樣:
var customText: String? var defaultText = "您好" var textToUse = "" var textToUse = customText ?? defaultText
?? 的意思就是如果textToUse為nil則選擇defaultText 否則選擇customText
函數(shù)式
比如我們獲取10以內(nèi)的奇數(shù), 第一想法是,用for循環(huán)呀:
var arr = [Int]() for i in 1...10 { if i % 2 == 1 { arr.append(i) } } print(arr)
當(dāng)然了,必然可以計算出結(jié)果,如果換種思路呢,swift內(nèi)置filter函數(shù):
var arr = (1...10).filter { (num) -> Bool in num % 2 == 1 } print(arr)
閉包 \ 函數(shù)
舉個栗子,兩個字符串拼接
使用函數(shù):
func sum(a: String, b: String) -> String { return a + b } var result = sum(a: "你好", b:"哈哈哈")
如果使用閉包的話:
var sumStringClosure: (String, String) -> String = { $0 + $1 } sumStringClosure("hello", "world")
有木有感覺easy了好多
convenience init 便利初始化
我們聲明一個類,給這個類設(shè)置變量然后將其初始化
class Animal { var dog: Int? var cat: Int? init(dog: Int, cat: Int) { self.dog = dog self.cat = dog } } var daDi = Animal(dag: 2, cat: 4) daDi.dog daDi.cat
假如我們想在每次用到 Animal這個類的時候,我們想著給這個類中的dog和cat都設(shè)置好數(shù)量,我們就可以用convenience init來設(shè)置
class Animal { var dog: Int? var cat: Int? init(dog: Int, cat: Int) { self.dog = dog self.cat = dog } convenience init() { self.init(dog: 10, cat: 10) } } var daDi = Animal() daDi.dog daDi.cat
屬性觀察
自從swift更新到swift3之后 我們發(fā)現(xiàn) 變量的set\get方法發(fā)生改變了有木有,添加了一個很方便的屬性就是willSet和didSet,比如我們?nèi)绻笠粋€正方形的周長,使用function的話是這樣子的 :
var length :Double? func getDiameter(length: Double) -> Double { return length * 4 } getDiameter(length: 10)
如果我們使用變量的屬性觀察方法:
var perimeter: Double? var length: Double? { willSet { print("準(zhǔn)備賦值中") } didSet { perimeter = length! * 4 } } length = 20 perimeter
willSet
是在屬性發(fā)生改變之前調(diào)用的
didSet
是在屬性發(fā)生改變之后調(diào)用的。
遍歷方法
打印字符串:如果使用while 來
var i = 0 while i < 5 { print("irembeu") i += 1 }
我們必須要定義一個變量來確保打印達到我們要求的次數(shù),但是我們定義越多的變量就意味著出錯的風(fēng)險越大,所以還是盡量少寫點兒代碼,改成for循環(huán)版:
for _ in 1...10 { print("itembeu") }
不需要我們定義多余變量,因為swift語法設(shè)計的時候用_來代替可以忽略的變量了
計算屬性\ 函數(shù)
取圓的直徑和半徑:
1、使用函數(shù):在這種情況下,我們根據(jù)半徑求直徑,根據(jù)已經(jīng)直徑求半徑,需要寫兩個function
func getDiameter(radius: Double) -> Double { return radius * 2} func getRadius(diameter: Double) -> Double { return diameter / 2} getDiameter(radius: 20) getRadius(diameter: 100)
2、使用變量的計算屬性
var radius: Double = 10 var diameter: Double { get { return radius * 2 } set { radius = newValue / 2 } } radius // 20 diameter // 40 diameter = 600 radius // 300
我們知道直徑和半徑是相互依存的關(guān)系的,使用變量的計算屬性這樣看起來要比使用函數(shù)計算要簡潔的多了。
泛型
如果我們需要將不同類型數(shù)組中的變量打印輸出,我們可能會這樣做:
var stringArr = ["騎士", "湖人", "公牛"] var intArr = [1, 3, 4, 5, 6] var doubleArr = [1.0, 2.0, 3.0] func printStringArr(a: [String]) { for s in a { print(s) } } func printIntArr(a: [Int]) { for i in a { print(i) } } func printDoubleArr(a: [Double]) {for d in a { print(d) } }
我們需要定義不同類型的數(shù)組,如果類型多了,那我們做的無謂的工作就有點兒多了,這時候我們?nèi)绻褂梅盒蛠斫鉀Q這個問題的話:
func printElementFromArr<T>(elements: [T]) { for e in elements { print(e) } } printElementFromArr(elements: [1,2,3,4])
簡單好多 有木有, 泛型是Swift語言強大的核心,泛型是對類型的抽象,使用泛型開發(fā)者可以更加靈活方便的表達代碼意圖。有參函數(shù)的參數(shù)必須有一個明確的參數(shù)類型,有些時候開發(fā)者會遇到這樣一種情況,就像上面我們舉的這個例子,由于變量有類型之分,實現(xiàn)相同的功能,可能需要重載成多個函數(shù)來實現(xiàn),這大大浪費了開發(fā)成本,使用泛型,可以完美的解決這個問題。
拓展
swift 中沒有了OC中的category 但是保留了extension, 我們和extension打交道的時候也就比較多了, 如果我們需要計算一個數(shù)的平方,我們可以聲明一個函數(shù), 像這樣:
func squ(x: Int) -> Int { return x * x } var s = squ(x: 10)
那如果我們要求10 的4次方的話,我們就要var s = squ(x: 10)
squ(x: s)創(chuàng)建多余變量。
使用拓展:
extension Int { var squ: Int { return self * self } } 10.squ 10.squ.squ
簡潔,不需要多創(chuàng)建變量。
Gaurd let \ if let
檢驗用戶名和密碼:
1、使用if let, 我們需要一層層的嵌套
var uName: Double? var uPassword: Double? func userLogIn() { if let username = uName { if let password = uPassword { print("歡迎, \(username)"!) } } }
2、使用gaurd let, 如果uName或者uPassword為nil的話,程序就會走return方法,提前結(jié)束運行, 否則就會print("歡迎, \(username)!")
var uName: Double? var uPassword: Double? func userLogIn() { guard let username = uName, let password = uPassword else { return } print("歡迎, \(username)!") }
相關(guān)文章
Swift中的Access Control權(quán)限控制介紹
這篇文章主要介紹了Swift中的Access Control權(quán)限控制介紹,本文講解了private、internal、public三個關(guān)鍵字的使用,需要的朋友可以參考下2015-05-05