關於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)!")
}