Swift基本語法
簡介
1.什么是Swift
Swift是蘋果于2014年WWDC(蘋果開發(fā)者大會)發(fā)布的全新編程語言
Swift在天朝譯為“雨燕”
跟Objective-C一樣,可以用于開發(fā)iOS、Mac應(yīng)用程序
蘋果從2010年7月開始設(shè)計Swift語言,耗時4年打造
2.Swift的語法特點
從它的語法中能看到Objective-C、JavaScript、Python等語言的影子
語法簡單、代碼簡潔、使用方便
可與Objective-C混合使用(相互調(diào)用)
3.為什么要設(shè)計Swift語言
讓應(yīng)用開發(fā)更簡單、更快、更穩(wěn)定
確保最終應(yīng)用有著更好的質(zhì)量
編程語言對比
腳本語言(比如Python)
通常易于編寫和測試,不需要經(jīng)歷編譯-鏈接-運行三個繁瑣的步驟
但并不是非常強大,難以帶來高質(zhì)量程序
如果你希望編寫一款游戲,完全利用設(shè)備的性能,那么這樣的語言并不理想
傳統(tǒng)編程語言(比如Objective-C)
使開發(fā)者能更好地利用設(shè)備的性能,開發(fā)更復(fù)雜的應(yīng)用
但通常較難掌握,在編譯和測試時也更麻煩(經(jīng)歷編譯-鏈接-運行三個步驟)
Swift
借鑒了Objective-C、JavaScript、Python等語言的優(yōu)點
目標(biāo):簡單、高效、強大
相關(guān)數(shù)據(jù)
Xcode版本必須>= 6.0,才能使用Swift進行調(diào)試和開發(fā)
Swift自從發(fā)布之后,備受開發(fā)者關(guān)注,1天的時間內(nèi)
Xcode 6 beta下載量突破1400萬次
官方發(fā)布的電子書《The Swift Programming Language》下載量突破37萬次
一位國外開發(fā)者已經(jīng)用Swift實現(xiàn)了Flappy Bird游戲(這位開發(fā)者上手Swift的時間只有4個小時,編程加上休息時間,接近9個小時)
語法須知
2個不需要
不需要編寫main函數(shù):全局作用域中的代碼會被自動當(dāng)做程序的入口點(從上往下執(zhí)行)
不需要在每一條語句后面加上分號
let radius =10
你喜歡的話,也可以加上 let radius =10;
有一種情況必須加分號:同一行代碼上有多條語句時
let radius =10; let radius2 =15
注釋
單行注釋 // 這是單行注釋
多行注釋/* 這是多行注釋 /
跟其他語言不太一樣的是,Swift的多行注釋可以嵌套多行注釋
/ haha /* hehe */ haha */
常量和變量
如何聲明常量和變量
用let來聲明常量
let radius =10
用var來聲明變量
var age =20
var x =0.0, y =0.0, z =0.0
常量和變量的命名
基本上可以用任何你喜歡的字符作為常量和變量名
let π =3.14159
let 網(wǎng)址 ="http://ios.smallSun.cn"
常量和變量名的注意點
不能包含數(shù)學(xué)符號(比如 + 和 * )
不能包含箭頭(比如↑、↓、←、→)
不能包含非法無效的Unicode字符(比如? 、?)
不能是關(guān)鍵字(比如let、var)
不能包含橫線–、 制表符(比如my–name)
不能以數(shù)字開頭(比如 123go)
不能是單獨一個下劃線_ (比如var _ =10)
數(shù)據(jù)類型
Swift中常用的數(shù)據(jù)類型有
Int、Float、Double、Bool
String、Character、Array、Dictionary
可以看出,數(shù)據(jù)類型的首字母都是大寫的
如何指定變量\常量的數(shù)據(jù)類型
在常量\變量名后面加上“冒號:” 和 “類型名稱”
var age :Int =10
上面代碼表示:定義了一個Int類型的變量age,初始值是10
一般來說,沒有必要明確指定變量\常量的類型
如果在聲明常量\變量時賦了初始值,Swift可以推斷出這個常量\變量的類型
var age =20 // Swift會推斷出age是Int類型,因為20是個整數(shù)
整數(shù)
整數(shù)分為2種類型
有符號(signed):正、負(fù)、零
無符號(unsigned):正、零
Swift提供了8、16、32、64位的有符號和無符號整數(shù),比如
UInt8:8位無符號整型
Int32:32位有符號整型
整數(shù)的最值
可以通過min和max屬性來獲取這個類型的最小值和最大值
let minValue =UInt8.min // UInt8 類型的 minValue等于0
let maxValue =UInt8.max // UInt8 類型的 maxValue等于255
Int和UInt
Swift提供了特殊的有符號整數(shù)類型Int和無符號整數(shù)類型UInt
Int\UInt的長度和當(dāng)前系統(tǒng)平臺一樣
在32位系統(tǒng)平臺上,Int和UInt的長度是32位
在64位系統(tǒng)平臺上,Int和UInt的長度是64位
Int在32位系統(tǒng)平臺的取值范圍:-2147483648 ~ 2147483647
建議
在定義變量時,別總是在考慮有無符號、數(shù)據(jù)長度的問題
盡量使用Int,這樣可以保證代碼的簡潔、可復(fù)用性
存儲范圍
每種數(shù)據(jù)類型都有各自的存儲范圍
Int8的存儲范圍是:–128 ~ 127
UInt8的存儲范圍是:0 ~ 255
如果數(shù)值超過了存儲范圍,編譯器會直接報錯
下面的語句都會直接報錯
let num1 :UInt8 = -1
// UInt8不能存儲負(fù)數(shù)
let num2 :Int8 =Int8.max +1
// Int8能存儲的最大值是Int8.max
整數(shù)的表示形式
整數(shù)的4種表示形式
十進制數(shù):沒有前綴
var i1 =10 // 10
二進制數(shù):以0b為前綴
var i2 =0b1010 // 10
八進制數(shù):以0o為前綴
var i3 =0o12 // 10
十六進制數(shù):以0x為前綴
var i4 =0xA // 10
類型別名
可以使用typealias關(guān)鍵字定義類型的別名,跟C語言的typedef作用類似
typealias MyInt =Int
// 給Int類型起了個別名叫做MyInt
原類型名稱能用在什么地方,別名就能用在什么地方
聲明變量類型
var num :MyInt =20
獲得類型的最值
var minValue =MyInt.min
類型轉(zhuǎn)換
var num2 =MyInt(3.14)// 3
浮點數(shù)
浮點數(shù),就是小數(shù)。Swift提供了兩種浮點數(shù)類型
Double:64位浮點數(shù),當(dāng)浮點值非常大或需要非常精確時使用此類型
Float:32位浮點數(shù),當(dāng)浮點值不需要使用Double的時候使用此類型
精確程度
Double:至少15位小數(shù)
Float:至少6位小數(shù)
如果沒有明確說明類型,浮點數(shù)默認(rèn)就是Double類型
let num =0.14 // num是Double類型的常量
浮點數(shù)的表示形式
浮點數(shù)可以用 十進制 和十六進制 2種進制來表示
十進制(沒有前綴)
沒有指數(shù):var d1 =12.5
有指數(shù) :var d2 =0.125e2
// 0.125e2 == 0.125 * 102
MeN == M * 10的N次方
十六進制(以0x為前綴,且一定要有指數(shù))
var d3 =0xC.8p0
// 0xC.8p0 == 0xC.8 * 2o == 12.5 * 1
0xMpN == 0xM * 2的N次方
var d3 =0xC.8p1
數(shù)字格式
數(shù)字可以增加額外的格式,使它們更容易閱讀
可以增加額外的零0
let money =001999 // 1999
let money2 =001999.000 // 1999.0
可以增加額外的下劃線_,以增強可讀性
let oneMillion1 =1_000_000 // 1000000
let oneMillion2 =100_0000 // 1000000
let overOneMillion =1_000_000.000_001 // 1000000.000001
增加了額外的零 0和下劃線_,并不會影響原來的數(shù)值大小
類型轉(zhuǎn)換
下面的語句是錯誤的
let num1 =3 // num1是Int類型
let num2 =0.14 // num2是Double類型
let sum =num1 +num2 // 這行會報錯
// 只有將num1轉(zhuǎn)為Double類型,才能與num2進行相加
下面的語句是正確的
let sum =Double(num1) +num2
注意
下面的寫法是正確的
let sum =3 +0.14
// 等3和0.14相加得到結(jié)果3.14后,編譯器才會自動推斷出sum是Double類型
字符串
字符串是String類型的數(shù)據(jù),用雙引號""包住文字內(nèi)容
var website ="http://ios.itcast.cn"
字符串的常見操作
用加號 + 做字符串拼接
var scheme ="http://"
var path ="ios.itcast.cn"
var website =scheme +path
// website的內(nèi)容是"http://ios.itcast.cn"
用反斜線 \ 和 小括號() 做字符串插值(把常量\變量插入到字符串中)
let hand =2
var age =20
var str ="我今年(age)歲了,有(hand)只手"
// str的內(nèi)容是"我今年20歲了,有2只手"
打印輸出
Swift提供了2個打印輸出函數(shù)
println:輸出內(nèi)容后會自動換行
print:對比println,少了個自動換行的功能
示例
輸出字符串
println("歡迎學(xué)習(xí)Swift教程")
var name ="Swift\n"
print(name)
輸出其他數(shù)據(jù)類型
var age =7
println(age)
println("我今年(age)歲")
元組類型
什么元組類型
元組類型由 N個任意類型的數(shù)據(jù)組成(N>=0)
組成元組類型的數(shù)據(jù)可以稱為“元素”
var position = (x :10.5, y :20)
// position有2個元素,x、y是元素的名稱
var person = (name :"jack")// person只有name一個元素
元素的訪問
用元素名稱
position.x
position.y
用元素位置
position.0 // 相當(dāng)于postion.x
position.1 // 相當(dāng)于postion.y
元組類型的細(xì)節(jié)
可以省略元素名稱
var position = (10,20)
var person = (20,"jack")
可以明確指定元素的類型
var person : (Int,String) = (23,"rose")
注意o
在明確指定元素類型的情況下不能加上元素名稱
因此,下面的語句是錯誤的
var person : (Int,String) = (age :23, name :"rose")
可以用多個變量接收元組數(shù)據(jù)
var (x , y) = (10,20)// x是10,y是20
var point = (x,y)// point由2個元素組成,分別是10和20
元組類型的細(xì)節(jié)
可以將元素分別賦值給多個變量
var point = (10,20)
var (x , y) =point
// x是10,y是20
可以使用下劃線忽略某個元素的值,取出其他元素的值
var person = (20,"jack")
var (, name) = person
// name的內(nèi)容是“jack”,person中的元素20被忽略
可選類型
可選類型的使用場合
當(dāng)一個值可能存在,可能不存在的時候,就用可選類型
比如查找字符k在某個字符串中的位置
如果字符串是"jake",說明k的位置存在,是2
如果字符串是"kate",說明k的位置存在,是0
如果字符串是"itcast",說明k的位置不存在
那么k的位置就應(yīng)該用可選類型
可選類型的格式:類型名?
var kIndex :Int?
問號?表明kIndex的值是可選的,可能是一個Int,也可能值不存在
kIndex的值要么是Int類型,要么是nil(nil代表值不存在)
kIndex默認(rèn)就是nil,因此上面的語句相當(dāng)于
var kIndex :Int? =nil
可選類型的應(yīng)用
String有個toInt方法,可以將字符串轉(zhuǎn)為對應(yīng)的整數(shù)
有些字符串能轉(zhuǎn)成整數(shù),比如"156",可以返回156
有些字符串不能轉(zhuǎn)成整數(shù),比如"itcast",無法返回整數(shù)
因此toInt方法的返回值是一個可選的Int類型(即Int?)
字符串能轉(zhuǎn)成整數(shù),比如"156",就返回156
字符串不能轉(zhuǎn)成整數(shù),比如"itcast",說明返回的整數(shù)值不存在,是nil
let num ="156".toInt()// 156
let num2 ="itcast".toInt()// nil
注意:num和num2都是Int?類型,不是Int類型
可選類型的注意
注意
不能直接將可選類型賦值給具體類型
比如不能將Int?類型直接賦值給Int類型,因為Int?都不確定有沒有整數(shù)值
下面的寫法是錯誤的
var num :Int? =10
var numValue :Int =num //這行會報錯
相反,可以直接將Int類型賦值給Int?類型
下面的寫法是正確的
var numValue :Int =20
var num :Int? =numValue
強制解包
在可選類型的后面加個感嘆號!,就可以把可選類型的值取出來,賦值給具體類型
下面的寫法是正確的
var num :Int? =10
var numValue :Int =num!
// 將num中的值取出來,賦值給numValue
感嘆號!的意思是告訴編譯器:我確定可選類型里面有值,可以將值取出來了
基本概念
解包:將可選類型的值取出來
強制解包:使用感嘆號!將可選類型的值取出來
強制解包的注意
注意
如果可選類型的值不存在,仍然進行強制解包,會報一個錯誤
fatal error: Can't unwrap Optional.None
下面的代碼是錯誤的
var num :Int?
var numValue =num!// 這行會報錯
因此:在進行強制解包之前,一定要先檢測可選類型的值是否存在
可選類型和if
可以使用if語句來檢測一個可選類型的值是否存在
如果值存在,就返回true
如果值不存在,就返回false
let num ="156".toInt()
if num {
println("num的值是(num!)")
}else {
println("num的值不存在")
}
可選類型的價值
可選類型讓開發(fā)人員可以在程序運行時,檢測一個值是否存在
然后使用代碼來分別處理存在和不存在的情況
選擇綁定
選擇綁定的作用
用來確定一個可選類型的值是否存在
如果值存在,把該值賦給一個臨時常量\變量
如果值不存在,就不創(chuàng)建任何臨時常量\變量
選擇綁定的概念
可選類型的值有選擇地賦給臨時常量\變量
也可以稱為“選擇綁定解包”
選擇綁定的使用場合
if\while語句
選擇綁定的應(yīng)用
if let num ="156".toInt() {
println("num的值存在,是(num)")
} else {
println("num的值不存在")
}
如果"156".toInt()的值存在
就把值賦給臨時常量num,執(zhí)行第1 ~ 3行的大括號之間的代碼
如果"156".toInt()的值不存在
就不創(chuàng)建臨時常量num,執(zhí)行第3 ~ 5行的大括號之間的代碼
注意
這里的num是Int類型,不是Int?類型
num的作用域是第13行的大括號之間,不能用在第35行的大括號之間
也可以用臨時變量來存儲
if var num ="156".toInt() {
}else { }
隱式解包
默認(rèn)情況下:如果想將可選類型的值賦給具體類型,比如將Int?的值賦給Int類型,需要使用感嘆號!進行強制解包
var num :Int? =10
var numValue :Int =num!
被聲明為隱式解包的可選類型
不用進行強制解包
能夠自動解包:自動把可選類型的值取出來賦給具體類型
如何聲明一個隱式解包的可選類型
將 問號?改為 感嘆號!即可
var num :Int! =20
var numValue :Int =num // 自動解包,不用再使用! 進行強制解包
// num是被聲明為隱式解包的可選類型Int!
隱式解包的原理和應(yīng)用
隱式解包的原理
相當(dāng)于告訴編譯器:這個可選類型的值一直都存在,絕對能取出里面的值
所以取值時可以不用加感嘆號!,能夠自動解包
隱式解包的應(yīng)用
如果某個常量\變量的值,在有些情況下一定存在,就可以用隱式解包
比如銀行卡的余額就可以聲明為隱式解包的可選類型
只要開通了銀行卡,銀行卡的余額肯定有值,從0 ~ 無限大
如果沒開通銀行卡或者銀行卡丟了,銀行卡的余額就沒有值,因為連卡都沒有
斷言
斷言是一種實時檢測條件是否為true的方法
如果條件為true,那么代碼繼續(xù)執(zhí)行
如果條件為false,就拋出錯誤信息,直接終止程序的運行
斷言的用法
使用全局的assert函數(shù)
assert函數(shù)接收一個Bool表達式和一個斷言失敗時顯示的消息
assert(index >= 0,"index必須大于0")
如果index大于等于0,就繼續(xù)執(zhí)行后面的代碼
如果index小于0,就拋出錯誤信息(下面的黑色字),直接終止程序的運行
assertion failed: index必須大于0
assert(index >=0)
可以省略錯誤信息,但不推薦,這樣不利于調(diào)試