??1、數(shù)據(jù)類型
??在Swift數(shù)據(jù)類型主要分為值類型和引用類型穷绵。其中,整型(Int)特愿、浮點(diǎn)型(Float)仲墨、布爾型(Bool)、字符(Character)揍障、字符串(String)宗收、元組、集合(Array亚兄、Dictionary和Set)、枚舉(enum)和結(jié)構(gòu)體(struct)均屬于值類型采驻;而類(class)是引用類型审胚。值類型在傳遞或者賦值的過程中先創(chuàng)建一個(gè)副本匈勋,然后再把副本傳遞或者賦值過去,在函數(shù)調(diào)用的過程中不會(huì)影響原始數(shù)據(jù)膳叨。引用類型會(huì)把數(shù)據(jù)本身的引用(指針)賦值或者傳遞過去洽洁,在函數(shù)調(diào)用過程中會(huì)影響原始數(shù)據(jù)。
??2菲嘴、let和var
??關(guān)于let和var饿自,通常情況下優(yōu)先使用let,如果確實(shí)要修改變量的值龄坪,才考慮使用var昭雌。引用類型在聲明的時(shí)候也經(jīng)常使用let,這樣做的主要目的是防止程序在運(yùn)行過程中被錯(cuò)誤的修改健田,使用let可以極大的提高程序的安全性烛卧。當(dāng)引用類型使用let時(shí),不能改變其引用(也就是指針)妓局,但是可以修改其引用的內(nèi)容:
let greenView: UIView = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
// 可以修改greenView里面的內(nèi)容
greenView.backgroundColor = .green // 修改greenView的背景顏色
// 但是不能修改greenView的引用
greenView = UIView() // 不能再讓它指向另外一個(gè)完全不同的實(shí)例
??3总放、浮點(diǎn)數(shù)的取余運(yùn)算
??在Swift 3之后,取余運(yùn)算符不能用于浮點(diǎn)數(shù)的計(jì)算好爬,只用使用truncatingRemainder(dividingBy: )函數(shù)來代替:
// 整數(shù)取余運(yùn)算
let a = 10 % 7 // 結(jié)果為3
// 浮點(diǎn)數(shù)用%取余運(yùn)算會(huì)報(bào)錯(cuò)
let b = 10.0 % 7.0
// 只能使用truncatingRemainder(dividingBy: )函數(shù)
var doubleA = 9.0
doubleA = doubleA + 8
doubleA = doubleA.truncatingRemainder(dividingBy: 7) // 結(jié)果為3.0
??4局雄、恒等于(===)
??只有引用類型才能使用===或者!==進(jìn)行比較,值類型是不能使用它們進(jìn)行比較存炮。比如手炬搭,字符串String類型不能使用恒等于進(jìn)行比較,但是UIView實(shí)例對象可以:
let str1 = "LeBron James"
let str2 = "Dwyane Wade"
if str1 == str2 {
print("true")
} else {
print("false")
} // 輸出false
// 值類型不能進(jìn)行恒等于比較僵蛛,編譯報(bào)錯(cuò)
let arr1 = [1, 3, 5]
let arr2 = [2, 4, 6]
if arr1 === arr2 {
print("true")
} else {
print("false")
} // 直接報(bào)錯(cuò)
// 引用類型可以進(jìn)行恒等于比較
let greenView = UIView(frame: CGRect(x: 0, y: 0, width: 50, height: 50))
greenView.backgroundColor = .green
let redView = UIView(frame: CGRect(x: 0, y: 0, width: 50, height: 50))
redView.backgroundColor = .red
if greenView === redView {
print("greenView === redView")
} else {
print("greenView !== redView")
} // 輸出greenView !== redView
??5尚蝌、位運(yùn)算符
??位運(yùn)算是以二進(jìn)制的形式進(jìn)行的,其操作數(shù)和結(jié)果均為整型充尉。位運(yùn)算在iOS開發(fā)中我們見得最多的可能就是位移枚舉:
??聲明兩個(gè)用二進(jìn)制形式表示的變量a和b飘言,其中0b是二進(jìn)制的前綴,對它們進(jìn)行相應(yīng)的位運(yùn)算結(jié)果如下:
let a: UInt8 = 0b110010 // 50
let b: UInt8 = 0b1100100 // 100
// 按位取反運(yùn)算
print("~a = \(~a), ~b = \(~b)") // ~a = 205, ~b = 155
// 按位或運(yùn)算
print("a | b = \(a | b)") // a | b = 118
// 按位與運(yùn)算
print("a & b = \(a & b)") // a & b = 32
// 按位異或運(yùn)算
print("a ^ b = \(a ^ b)") // a ^ b = 86
// 左移和右移運(yùn)算
print("a >> 2 = \(a >> 2)") // a >> 2 = 12
print("b >> 2 = \(b >> 2)") // b >> 2 = 25
print("a << 2 = \(a << 2)") // a << 2 = 200
print("b << 2 = \(b << 2)") // b << 2 = 144
??可以自己畫小圖圖進(jìn)行手動(dòng)計(jì)算驼侠。具體的運(yùn)算法則如下:
按位與:&
只有對應(yīng)的兩個(gè)二進(jìn)位都為1時(shí)姿鸿,其結(jié)果才為1,否則為0倒源;
按位或:|
只要對應(yīng)的兩個(gè)二進(jìn)位有一位為1時(shí)苛预,其結(jié)果就為1,否則為0
按位異或:^
當(dāng)對應(yīng)的二進(jìn)位不相同時(shí)笋熬,其結(jié)果就為1热某,否則為0
按位異或的補(bǔ)充:
1.相同數(shù)值進(jìn)行異或,其結(jié)果為0;
2.多個(gè)數(shù)值進(jìn)行異或運(yùn)算時(shí)昔馋,其位置可以交換筹吐;
3.任何數(shù)值跟0進(jìn)行異或運(yùn)算,其結(jié)果還是原來的數(shù)值秘遏。
按位取反:~(單目運(yùn)算符)
左移運(yùn)算符:<<
1.把整數(shù)a的各二進(jìn)位全部左移n位丘薛,高位丟棄,低位補(bǔ)0邦危。左移n位其實(shí)就是乘以2的n次方洋侨;
2.由于左移是丟棄最高位,所以符號(hào)位也會(huì)被丟棄倦蚪,因此左移出來的結(jié)果可能會(huì)改變數(shù)值的正負(fù)性希坚。
右移運(yùn)算符:>>
1.把整數(shù)a的各二進(jìn)位全部右移n位,保持符號(hào)位不變审丘。右移n位其實(shí)就是除以2的n次方吏够;
2.為正數(shù)時(shí),符號(hào)位為0滩报,最高位補(bǔ)0锅知;
3.為負(fù)數(shù)時(shí),符號(hào)位為1脓钾,最高位補(bǔ)0或補(bǔ)1售睹,這取決于編譯系統(tǒng)的規(guī)定。
??6可训、數(shù)字表示方式
??在為一個(gè)整型進(jìn)行賦值時(shí)昌妹,可以使用二進(jìn)制、八進(jìn)制和十六進(jìn)制握截,表示方式分別為:
二進(jìn)制:以0b作為前綴(即數(shù)字0和字母b)飞崖;
八進(jìn)制:以0o作為前綴(即數(shù)字0和字母o);
十六進(jìn)制:以0x作為前綴(即數(shù)字0和字母x)谨胞。
??除了整型之外固歪,在進(jìn)行數(shù)學(xué)計(jì)算時(shí),可能需要用到科學(xué)計(jì)算胯努。如果采用十進(jìn)制的指數(shù)表示牢裳,需要用到大寫的字母E或小寫的字母e;如果采用十六進(jìn)制的指數(shù)表示叶沛,需要用到大寫字母P或小寫字母p蒲讯。以十進(jìn)制的指數(shù)計(jì)算為例:
let a = 4e2 // 即4乘以10的2次方
??有時(shí)候?yàn)榱朔奖汩喿x,可以在整數(shù)或者浮點(diǎn)數(shù)中添加0或者下劃線灰署,這兩種做法均不會(huì)影響實(shí)際的結(jié)果:
let a = 001.414 // 1.414
let b = 100_000_000 // 小目標(biāo)
??7判帮、可選類型
??與Objective-C不同局嘁,Swift中所有的數(shù)據(jù)類型在聲明時(shí)都不能為空值(nil),必須給它賦一個(gè)明確的值脊另。但是导狡,在實(shí)際開發(fā)時(shí),難免碰到要賦空值的情況偎痛,為了解決這個(gè)問題,Swift中提供了可選類型独郎〔嚷螅可選類型的語法是在某個(gè)數(shù)據(jù)類型后面加上問好(?)或者感嘆號(hào)(!):
var a: Int = 10
a = nil // 編譯報(bào)錯(cuò)
let str: String = nil // 編譯報(bào)錯(cuò)
let str: String! = nil // 可選類型
var arr: [Float]? // 可選類型
??使用可選類型聲明的變量在使用時(shí)需要解包。解包可分為顯式解包和隱式解包氓癌。使用問號(hào)聲明的變量在使用時(shí)谓谦,需要用!進(jìn)行解包贪婉,這稱之為顯式解包反粥;而使用感嘆號(hào)聲明的變量在使用時(shí),可以不用疲迂!進(jìn)行解包才顿,這稱之為隱式隱式解包。通常情況下尤蒿,解包操作是比較危險(xiǎn)的郑气,應(yīng)該慎用。好的做法是用可選綁定腰池。