swift語(yǔ)言從剛剛出道時(shí)火的不行,到現(xiàn)在逐漸的熱度消退。作為Apple官方主推的一種新的編程語(yǔ)言,自從Open Source以來(lái),吸引了一大批牛人投入到開(kāi)源社區(qū)進(jìn)行討論。雖然平時(shí)在使用swift語(yǔ)言,但是對(duì)其很多語(yǔ)言的細(xì)節(jié)還是不夠清晰。同時(shí)swift3.0也即將發(fā)布,頓時(shí)感覺(jué)需要對(duì)其語(yǔ)法進(jìn)行重新梳理,整理好這門(mén)語(yǔ)言的來(lái)龍去脈。放松心情,迎接swift3.0的到來(lái)。
本文主要是基于swift2.0版本語(yǔ)法的整理。鍛煉自己表達(dá)能力,同時(shí)記錄下自己學(xué)習(xí)的過(guò)程,以備自己復(fù)習(xí)查詢。
hello swift
打印
print("hello swift")
常量和變量
- 常量
let num1: Int = 20
let num2 = 20
- 變量
var num2: Int = 20
var num3 = 20
命名規(guī)則:常量與變量名不能包含數(shù)學(xué)符號(hào),箭頭,保留的(或者非法的)Unicode 碼位,連線與制表符。也不能以數(shù)字開(kāi)頭,但是可以在常量與變量名的其他地方包含數(shù)字。
當(dāng)你聲明常量或者變量的時(shí)候可以加上類型標(biāo)注(type annotation),說(shuō)明常量或者變量中要存儲(chǔ)的值的類型。如果要添加類型標(biāo)注,需要在常量或者變量名后面加上一個(gè)冒號(hào)和空格,然后加上類型名稱。
var num: Int
num = 10```
#####枚舉
+ 定義枚舉
寫(xiě)法1
enum num{
case one, two, three
}
寫(xiě)法2
enum num{
case one,
case two,
case three
}
寫(xiě)法3:定義枚舉同時(shí)定義類型,默認(rèn)是整形,后面的值+1。
enum height:Double{
case one = 2.0,
case one = 3.0,
case one = 4.0
}
+ 定義枚舉變量
var number1 = num.one
或者
var number2: num = one
當(dāng)然定義也可以使用常量let
```let number2: num = one```
+ 枚舉原始值
print(num.one.rawValue)
#####元組
元組(tuples)把多個(gè)值組合成一個(gè)復(fù)合值。元組內(nèi)的值可以是任意類型,并不要求是相同類型。
let student = ("小明", 20, 99.0)
取得元組的第一個(gè)值
print(student.0)
其他定義方式
let student2 = (name:"小明",age:20,score:99.0)
let (name , age , score) = ("小明", 20, 99.0)
let (name1 , age1 , ) = ("小明", 20, 99.0)//不關(guān)心元組中某一個(gè)值,可以使用通配符來(lái)忽略
#####集合類型:數(shù)組,字典,集合
swift中提供數(shù)組,字典和集合三種基本的集合類型來(lái)存儲(chǔ)集合數(shù)據(jù)。
> 數(shù)組是有序有重復(fù)集合
字典是無(wú)序鍵值對(duì)集
集合是無(wú)序無(wú)重復(fù)的集合

+ 數(shù)組(Arrays)
var arr = [1,2,3]
var arr1:Array = [1,2,3]
var arr2:Array<Int> = [1,2,3]
var arr3:[Int] = [1,2,3]
//空數(shù)組
var arrEmpty =[]
var arrEmpty1:Array =[]
var arrEmpty2:Array<Int> =[]
var arrEmpty3:[Int] =[]
//不可變數(shù)組:
var arr8 = []
//可變數(shù)組:
let arr9 = []
// 如果想明確表示數(shù)組中存放的是不同類型的數(shù)據(jù), 可以使用Any關(guān)鍵字, 表示數(shù)組中可以存放不同類型的數(shù)據(jù)
var arr11:Array<Any> = [1, "lnj", 1.75]
// 數(shù)組遍歷
var arr1 = [1, 2, 3]
for var i = 0 ; i < arr1.count ; i++
{
print(arr1[i])
}
for number in arr1
{
print(number)
}
for i in 0..<arr1.count
{
print(arr1[i])
}
// 取出數(shù)組中某個(gè)區(qū)間范圍的值
var arr2 = [1, 2, 3]
for number in arr2[0..<3]
{
print(number)
}
+ 字典(Dictionarys)
var dict = ["name":"zz", "age":20]
var dict1:Dictionary = ["name":"zz", "age":20]
var dict2:Dictionary<String,AnyObject> = ["name":"zz", "age":20]
var dict3:[String:AnyObject] = ["name":"zz", "age":20]
var dict4:[String:AnyObject] = Dictionary(dictionaryLiteral: ("name", "zz"), ("age", 20))
//不可變數(shù)組:
var dict5 = [:]
//可變數(shù)組:
let dict6 = [:]
//遍歷字典
var dict7 = ["name":"zz", "age":20]
for (key , value) in dict7
{
print("key = (key) value = (value)")
}
var dict8 = ["name":"zz", "age":20]
for key in dict8.keys
{
print("key = (key)")
}
var dict9 = ["name":"zz", "age":20]
for value in dict9.values
{
print("value = (value)")
}
+ 集合(Sets)
當(dāng)對(duì)元素的順序不太關(guān)注或者需要所有的元素只出現(xiàn)一次的時(shí)候可以使用集合
//var sess = ["name", "zz", "age","age",2]
//sess的定義是數(shù)組的定義
var sess1:Set = ["name", "zz", "age","age",2]
//sess1的定義是使用數(shù)組來(lái)定義一個(gè)set,其中重復(fù)的元素會(huì)只顯示一個(gè),自動(dòng)忽略其他重復(fù)的元素。
var sess2:Set<String> = ["name", "zz", "age","age"]
//sess2的定義是使用數(shù)組來(lái)定義一個(gè)set,其中重復(fù)的元素會(huì)只顯示一個(gè),指定元素為String類型,添加其他類型元素會(huì)直接報(bào)錯(cuò)。
// 遍歷set
for genre in sess1 {
print("(genre)")
}
let sess2:Set = ["name", "zz", "age"]
for genre in sess2.sort() {
print("(genre)")
}
//在sess2中如果中添加了其他了類型的元素,比如整形2。則sort() 方法就不能被調(diào)用。
//只能使用sort(isOrderedBefore: (String, String) -> Bool) 方法根據(jù)傳遞的參數(shù)自定義排序
//sort() 方法的默認(rèn)的排序按照字母az,數(shù)組09,
//如果包含中文此時(shí)排序基本沒(méi)有意義。測(cè)試代碼
let sess3: Set = ["張三", "李四", "王五", "a小李","三", "四", "五", "小","小李子"]
for genre in sess3.sort() {
print("(genre)")
}
結(jié)果:a小李 三 五 四 小 小李子 張三 李四 王五。
//其他排序方法
let constantArray: Set = [5, 1, 6, 4, 2, 3]
let bbbb = constantArray.sort{$0>$1}
print(bbbb)
let constantArray1: Set = [5, 1, 6, 4, 2, 3]
let bbbb1 = constantArray1.sort(>)
print(bbbb1)
let constantArray2: Set = [5, 1, 6, 4, 2, 3]
let bbbb2 = constantArray2.sort { (a, b) -> Bool in
return a > b
}
print(bbbb2)
**set之間的交并集**

intersect:返回兩個(gè)集合中都存在的數(shù)據(jù)
exclusiveror:返回兩個(gè)集合各自特有的數(shù)據(jù),忽略兩個(gè)集合中都有的數(shù)據(jù)
union:返回兩個(gè)集合中所有數(shù)據(jù)
subtract:返回不包含右邊集合的所有數(shù)據(jù)
4個(gè)方法都把合適數(shù)據(jù)組織成一個(gè)新的集合進(jìn)行返回。
**set之間的比較**
- 使用“是否相等”運(yùn)算符( == )來(lái)判斷兩個(gè)集合是否包含全部相同的值。
(判斷set元素相等還可以使用哈希值,swift中所有的基本數(shù)據(jù)類型都是可以hash的,哈希值相等可以判斷對(duì)象相同,如a == b
即a.hashValue == b.hashValue)
- 使用 isSubsetOf(_:) 方法來(lái)判斷一個(gè)集合中的值是否也被包含在另外一個(gè)集合中。
- 使用 isSupersetOf(_:) 方法來(lái)判斷一個(gè)集合中包含另一個(gè)集合中所有的值。
- 使用 isStrictSubsetOf(_:) 或者 isStrictSupersetOf(_:) 方法來(lái)判斷一個(gè)集合是否是另外一個(gè)集合的子集合或者父集合并且兩個(gè)集合并不相等。
- 使用 isDisjointWith(_:) 方法來(lái)判斷兩個(gè)集合是否不含有相同的值。
let a: Set = ["a", "b", "c", "d", "e"]
let b: Set = ["a", "b"]
let c: Set = ["a", "b", "c", "d", "e","f"]
print(b.isSubsetOf(a)) // b是否包含在a中 true
print(a == b) // a和b是否相等 false
print(a.isSupersetOf(b)) // a是否包含b所有的值 true
print(a.isDisjointWith(c))// a和c是否含有不相同的值 false
#####5.字符和字符串
字符和字符串都使用 **“”** 雙引號(hào)來(lái)定義
+字符
var test:Character = "李"
// 雙引號(hào)中只能有一個(gè)字符,不如想“ab”這樣定義是錯(cuò)誤的。
+字符串
字符是單個(gè)字符的集合, 字符串是多個(gè)字符的集合, 想要存放多個(gè)字符需要使用字符串,使用雙引號(hào)和+可以拼接字符串
var a = "ab"
var b = "bc"
var str = a + b;
print(str)// abbc
#####運(yùn)算符
| 運(yùn)算符 |例|
|--|--|
| 基本運(yùn)算||
|+| a+b |
|- | a-b |
|* | a*b |
|/ | a/b |
|++| number++ |
|-- | number-- |
| % | print(10 % 3.5) 余數(shù)為3 支持對(duì)小數(shù)取模 |
| 賦值運(yùn)算 | 不允許連續(xù)賦值, 表達(dá)式是沒(méi)有值的. 避免 if (c == 9) 這種情況誤寫(xiě)為 if (c = 9)|
| = |m1 = 20|
| += |m1 += 10|
| -= |m1 -= 10|
| /= |m1 /= 10|
| *= |m1 *= 10|
| %= |m1 %= 5|
| 關(guān)系運(yùn)算|取得值是bool|
|>|m1 > 10|
|<|m1 < 10|
|>= |m1 >= 10|
|<=|m1 <= 10|
|== |m1 == 10|
|!=|m1 != 10|
|?:|m1 == 10 ? 11 : 12 |
| 邏輯運(yùn)算|只能操作bool類型|
|! | if !open |
|&& | if a >10 && a < 20 |
| 區(qū)間||
|... | 1...5 (1到5包括5 )|
|..<| 1..<5 (1到4不包括5)|
######\- 和 +
特殊的關(guān)于正負(fù)數(shù)運(yùn)算的運(yùn)算符
let three = 3
let minusThree = -three // minusThree 等于 -3
let plusThree = -minusThree // plusThree 等于 3, 或 "負(fù)負(fù)3”
######?? 空和運(yùn)算符
??運(yùn)算符:(a??b)如果a值不為空,則對(duì)a進(jìn)行強(qiáng)制解包,否則就返回一個(gè)默認(rèn)值b。
運(yùn)算符有兩個(gè)條件
+ 1 表達(dá)式a必須是一個(gè)可選值類型。
+ 2 默認(rèn)值b的類型必須和a的類型保持一致
let mycolor = "red"
var userDefualColor:String?
var usercolor = userDefualColor?? mycolor
返回結(jié)果為red,因?yàn)閡serDefualColor是一個(gè)可選值,其的默認(rèn)值是空。所以返回mycolor 即red。
######溢出運(yùn)算符
Swift中如果計(jì)算結(jié)果超出了它的類型能承載的范圍,那么就會(huì)發(fā)生溢出錯(cuò)誤,除非你已經(jīng)使用溢出運(yùn)算符來(lái)進(jìn)行操作:
溢出加法 &+
溢出減法 &-
溢出乘法 &*
溢出除法 &/
溢出求余 &%
#####可選值
可選值: optionals有兩種狀態(tài):
1.有值 2.沒(méi)有值, 沒(méi)有值就是nil
//有值
var optionalTest:Int? = 9
//沒(méi)有值
var optionalTest:Int?
var optionalTest:Int? = nil
// 可選值強(qiáng)制解包,對(duì)一個(gè)沒(méi)有值的可選值強(qiáng)制解包會(huì)報(bào)錯(cuò)。
var result = optionalTest!
// 可選綁定
if let result = optionalTest {
// do something
}
#####注釋
以c語(yǔ)言注釋非常像
// 這是一個(gè)注釋
/* 這是一個(gè),多行注釋 */
和c語(yǔ)言不一樣,swift多行注釋可以嵌套
/* 這是第一個(gè)多行注釋的開(kāi)頭
/* 這是第二個(gè)被嵌套的多行注釋 */
這是第一個(gè)多行注釋的結(jié)尾 */
#####分號(hào)
和大部分的語(yǔ)言不同,在swift語(yǔ)言中并不強(qiáng)調(diào)每一行的結(jié)束都添加分號(hào)**```;```**
當(dāng)然你也可以添加分號(hào)作為一行結(jié)束符號(hào),在swift語(yǔ)言也是可以的。
有一種必須添加分號(hào)的情況,就是在一行中你想寫(xiě)多個(gè)語(yǔ)句。比如
var me1 = 2; var me2 = 4
#####基本數(shù)據(jù)類型
######整數(shù)類型
var intValue1:Int8 = 6
var intValue2:Int16 = 7
var intValue3:Int32 = 8
var intValue4:Int64 = 9
+ Swift 提供了8,16,32和64位的有符號(hào)和無(wú)符號(hào)整數(shù)類型。這種按照長(zhǎng)度進(jìn)行劃分,更加精確,也更節(jié)省內(nèi)存空間。
+ 默認(rèn)情況下數(shù)據(jù)類型分為有符號(hào)的和無(wú)符號(hào)的,也就是說(shuō)有符號(hào)的Int8的范圍是(-128 ~ 127),無(wú)符號(hào)的UInt8的范圍是(0 ~ 255)如果超出了范圍編譯器會(huì)報(bào)錯(cuò)誤。
+ swift為我們提供了特殊類型Int,它與當(dāng)前平臺(tái)的原生字長(zhǎng)度相同。
- 在32位平臺(tái)上, Int和Int32長(zhǎng)度相同。
- 在64位平臺(tái)上, Int和Int64長(zhǎng)度相同。
當(dāng)然也有無(wú)符號(hào)的特殊類型UInt,和Int一樣它也是與當(dāng)前平臺(tái)的原生字長(zhǎng)度相同。
######浮點(diǎn)類型
Double:表示64位浮點(diǎn)數(shù),精度高,存儲(chǔ)數(shù)據(jù)大,至少有15位
Float:表示32位浮點(diǎn)數(shù),至少有6位
#####類型轉(zhuǎn)換
swift中不允許隱式類型轉(zhuǎn)換,必須使用強(qiáng)制類型轉(zhuǎn)換
/*
var intValue:Int = 10
var doubleValue:Double = intValue
*/
以上語(yǔ)句會(huì)報(bào)錯(cuò)。
正確寫(xiě)法
var intValue:Int = 10
var doubleValue:Double
doubleValue = Double(intValue)
注意:Double(intValue)并不會(huì)修改intValue的值, 而是通過(guò)intValue的值生成一個(gè)臨時(shí)的值賦值給doubleValue
#####Bool類型
Swift引入了真正的Bool類型
true
false
#####類型推斷
swift是類型安全的。可以清楚的知道代碼要處理值的類型,在編譯的時(shí)候會(huì)進(jìn)行類型檢查,如果傳遞的參數(shù)類型不一致,會(huì)提示錯(cuò)誤。
盡管如此,我們?cè)诼暶鞒A炕蛘咦兞康臅r(shí)候不一定需要顯示的指定類型。如果我們沒(méi)有指定類型,swift會(huì)使用類型推斷來(lái)選擇合適的類型。
let anotherPi = 3 + 0.14159
// anotherPi 會(huì)被推測(cè)為 Double 類型,因?yàn)槌霈F(xiàn)了浮點(diǎn)數(shù)類型
#####類型別名
typealias AudioSample = UInt16
將UInt16定義別名為AudioSample,然后就可以在任何使用UInt16的地方使用新定義的別名。
#####控制語(yǔ)句
+ if
和常用用法一致
+ switch
switch可以匹配區(qū)間和元祖
let count = 3_000_000_000_000
let countedThings = "stars in the Milky Way"
var naturalCount: String
switch count {
case 0:
naturalCount = "no"
case 1...3:
naturalCount = "a few"
case 4...9:
naturalCount = "several"
case 10...99:
naturalCount = "tens of"
case 100...999:
naturalCount = "hundreds of"
case 1000...999_999:
naturalCount = "thousands of"
default:
naturalCount = "millions and millions of"
}
print("There are (naturalCount) (countedThings).")
// 輸出 "There are millions and millions of stars in the Milky Way.”
“l(fā)et somePoint = (1, 1)
switch somePoint {
case (0, 0):
print("(0, 0) is at the origin")
case (_, 0):
print("((somePoint.0), 0) is on the x-axis")
case (0, _):
print("(0, (somePoint.1)) is on the y-axis")
case (-2...2, -2...2):
print("((somePoint.0), (somePoint.1)) is inside the box")
default:
print("0")
// _ 代表可以匹配任何值
+ for
除了常用的for循環(huán)樣式,for還可以用來(lái)循環(huán)字符串的字符,元祖和區(qū)間
let numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
for (animalName, legCount) in numberOfLegs {
print("(animalName)s have (legCount) legs")
}
// spiders have 8 legs
// ants have 6 legs
// cats have 4 legs
for character in "hello"{
print(character)
}
+ while 和repeat while
var a :Int = 1
while a < 10
{
a++
}
repeat
{
a++
}while a < 10
#####函數(shù)