關於swift的團體小結。本站提示廣大學習愛好者:(關於swift的團體小結)文章只能為提供參考,不一定能成為您想要的結果。以下是關於swift的團體小結正文
寫在後面
接觸swift也有段時間了,經過這段時間自己接觸和自創他人的經歷,記載幾點關於swift的小技巧,雖然不是什麼深邃的原理知識,但是在往常的項目中用到或答應以進步開發效率呢
🙃,哈哈,接上去就復雜總結一下:
枚舉(ENUM)
結合一個小場景, 比方我們要做一個關於性別判別的一個小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的默許text, 也就是說,假如我們沒有去人為設置,這個label就會用默許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
函數式
比方我們獲取10以內的奇數, 第一想法是,用for循環呀:
var arr = [Int]() for i in 1...10 { if i % 2 == 1 { arr.append(i) } } print(arr)
當然了,必定可以計算出後果,假如換種思緒呢,swift內置filter函數:
var arr = (1...10).filter { (num) -> Bool in num % 2 == 1 } print(arr)
閉包 \ 函數
舉個栗子,兩個字符串拼接
運用函數:
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 便當初始化
我們聲明一個類,給這個類設置變量然後將其初始化
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都設置好數量,我們就可以用convenience init來設置
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之後 我們發現 變量的set\get辦法發作改動了有木有,添加了一個很方便的屬性就是willSet和didSet,比方我們假如求一個正方形的周長,運用function的話是這樣子的 :
var length :Double? func getDiameter(length: Double) -> Double { return length * 4 } getDiameter(length: 10)
假如我們運用變量的屬性察看辦法:
var perimeter: Double? var length: Double? { willSet { print("預備賦值中") } didSet { perimeter = length! * 4 } } length = 20 perimeter
willSet
是在屬性發作改動之前調用的
didSet
是在屬性發作改動之後調用的。
遍歷辦法
打印字符串:假如運用while 來
var i = 0 while i < 5 { print("irembeu") i += 1 }
我們必需要定義一個變量來確保打印到達我們要求的次數,但是我們定義越多的變量就意味著出錯的風險越大,所以還是盡量少寫點兒代碼,改成for循環版:
for _ in 1...10 { print("itembeu") }
不需求我們定義多余變量,由於swift語法設計的時分用_來替代可以疏忽的變量了
計算屬性\ 函數
取圓的直徑和半徑:
1、運用函數:在這種狀況下,我們依據半徑求直徑,依據曾經直徑求半徑,需求寫兩個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
我們知道直徑和半徑是互相依存的關系的,運用變量的計算屬性這樣看起來要比運用函數計算要簡約的多了。
泛型
假如我們需求將不同類型數組中的變量打印輸入,我們能夠會這樣做:
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) } }
我們需求定義不同類型的數組,假如類型多了,那我們做的無謂的任務就有點兒多了,這時分我們假如運用泛型來處理這個問題的話:
func printElementFromArr<T>(elements: [T]) { for e in elements { print(e) } } printElementFromArr(elements: [1,2,3,4])
復雜好多 有木有, 泛型是Swift言語弱小的中心,泛型是對類型的籠統,運用泛型開發者可以愈加靈敏方便的表達代碼意圖。有參函數的參數必需有一個明白的參數類型,有些時分開發者會遇到這樣一種狀況,好像下面我們舉的這個例子,由於變量有類型之分,完成相反的功用,能夠需求重載成多個函數來完成,這大大糜費了開發本錢,運用泛型,可以完滿的處理這個問題。
拓展
swift 中沒有了OC中的category 但是保存了extension, 我們和extension打交道的時分也就比擬多了, 假如我們需求計算一個數的平方,我們可以聲明一個函數, 像這樣:
func squ(x: Int) -> Int { return x * x } var s = squ(x: 10)
那假如我們要求10 的4次方的話,我們就要var s = squ(x: 10)
squ(x: s)創立多余變量。
運用拓展:
extension Int { var squ: Int { return self * self } } 10.squ 10.squ.squ
簡約,不需求多創立變量。
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辦法,提早完畢運轉, 否則就會print("歡送, \(username)!")
var uName: Double? var uPassword: Double? func userLogIn() { guard let username = uName, let password = uPassword else { return } print("歡送, \(username)!") }