基本類型
- 變量和常量
使用 var
來(lái)聲明變量昧廷,使用 let
來(lái)聲明常量堪嫂,示例代碼:
var myVariable = 42
myVariable = 50
let myConstant = "Hello"
PS: 常量或變量的類型必須和你賦給它們的值一樣。但不必明確地聲明類型麸粮,聲明的同時(shí)賦值的話溉苛,編譯器會(huì)自動(dòng)推斷類型。
也可以顯式聲明變量弄诲,如下所示:
let url:String = "www.abc.com" //顯式聲明 url 為 String 類型
var a, b, c : Double //顯式聲明 a, b, c 均為 Double 類型
- 各種進(jìn)制表示
let decimalInt:Int = 17 //十進(jìn)制
let binaryInt:Int = 0b10001 //二進(jìn)制
let octalInt:Int = 0o21 //八進(jìn)制
let hexInt:Int = 0x11 //十六進(jìn)制
- 布爾型
let imTrue:Bool = false;
if imTrue { //條件語(yǔ)句愚战,不加括號(hào)。非0整型不能解讀為布爾類型
print("I'm true")
}
else {
print("I'm false")
}
if 1+1==2 { //OK
print("1 + 1 = 2")
}
- 浮點(diǎn)型
let floatNum:Float = 3.1415926 //Float 精度為小數(shù)點(diǎn)后6位齐遵,因此實(shí)際結(jié)果為 3.141593
let doubleNum:Double = 3.1415926
//PS: 默認(rèn)為 Double 類型
- Character
//Character 可以表示漢字或表情(若不顯式定義為 `Character` 類型寂玲,則為 `String` 類型)
let enLetter:Character = "a"
let cnLetter:Character = "你"
let dog:Character = "??"
let cool:Character = "\u{1F60E}"
- 元組
元組:將多個(gè)不同的值集合成一個(gè)數(shù)據(jù)。
特點(diǎn):可以有多個(gè)值梗摇;不同的值可以是不同類型拓哟。
示例代碼:
//定義
var point = (1, 3)
var httpResponse = (404, "Not Found")
//顯式定義,限定類型
var point2:(Int, Int, Int) = (1, 2, 4)
var httpResponse2:(Int, String) = (200, "OK")
//可以給變量命名伶授,這樣解包時(shí)可通過(guò)名字訪問(wèn)
var point3 = (x:1, y:2, z:4)
var point4:(x:Int, y:Int, z:Int) = (1, 2, 4)
//解包(即獲取元組里的元素)
let (xx, yy) = point
httpResponse.0
httpResponse.1
//命名后即可用名字訪問(wèn)
point3.x
point4.y
//可用下劃線 _ 表示對(duì)該變量不關(guān)心
let loginInfo = (true, "user")
let (isSuccess, _) = loginInfo
- 其他
//以科學(xué)計(jì)數(shù)法形式定義
var d = 1.2e5 //1.2*10^5
var e = 1.2e-5 //1.2*10^-5
//可用下劃線 _ 分隔大數(shù)断序,便于區(qū)分流纹。例如定義一百萬(wàn)
let bigNum = 1_000_000
此外,變量還可以命名為漢字(或其他 Unicode8 編碼的字符)或表情符號(hào)违诗,例如:
var 名字 = "Ace"
var ?? = "smile"
print(名字, ??)
print(名字, ??, separator:" - ") //自定義 print 分隔符(默認(rèn)是空格)
print(名字, ??, separator:"--", terminator:", end") //自定義結(jié)束符(默認(rèn)是回車 \n)
// 注意:?jiǎn)卧~不要拼錯(cuò)了
還可以在 print
中使用 \()
方便的顯示變量漱凝,例如:
let i=2, j=3, k=5
print("\(i) * \(j) * \(k) = \(i*j*k)") //打印結(jié)果:2 * 3 * 5 = 30\n
運(yùn)算符
- 算數(shù)運(yùn)算符
let x1:UInt8 = 12
let x2:UInt16 = 21
//二者必須強(qiáng)制轉(zhuǎn)換為相同類型才能進(jìn)行運(yùn)算
let m = UInt16(x1) + x2 //注意強(qiáng)轉(zhuǎn)的寫(xiě)法
let n = x1 + UInt8(x2)
邏輯控制語(yǔ)句
- for
for..in
循環(huán)示例代碼:
for index in 1...5 { //... 前后都是閉區(qū)間
index
// index = 3 //error, 這里的 index 是常量
}
for index in 1..<5 { //..< 前閉后開(kāi)區(qū)間
index
}
若不關(guān)心循環(huán)到了多少次,可以這么寫(xiě):
var result = 1
var base = 2
for _ in 1...10 { //忽略第幾次
result *= base
}
此外诸迟,有時(shí)為了跳出多個(gè)循環(huán)嵌套茸炒,可以給循環(huán)命名,例如:
// 跳出指定的循環(huán)阵苇,給循環(huán)命名
findAnswer:
for m in 1...300 { //
for n in 1...300 {
if m*m*m*m - n*n == 15*m*n {
print(m, n)
break findAnswer //結(jié)束循環(huán)過(guò)程
}
}
}
- while
while
循環(huán):
var i = 0
while i < 3 {
print(i)
i++
}
repeat..while
循環(huán)(相當(dāng)于 do..while
):
var j = 0
repeat {
j++
print(j)
} while j < 3
- switch
與 C
, Java
等語(yǔ)言相比壁公,Swift
語(yǔ)言的 switch
語(yǔ)句有許多變化。
var rating = "a"
switch rating {
case "A", "a": //判斷多種不同的值
print("great")
case "B":
print("so-so")
case "C":
print("bad")
default : //switch 必須窮舉所有情況
print("error")
}
注意: case 語(yǔ)句后無(wú)需 break, 執(zhí)行一個(gè) case 后自動(dòng)跳出绅项。
case
后可以是布爾類型或浮點(diǎn)型等紊册,例如:
let b = true
switch b {
case true:
print("true")
default:
// print("false")
// break
() //若無(wú)任何操作,可用 break 或 () 來(lái)結(jié)束
}
switch
高級(jí)用法趁怔,switch
后還可以是一個(gè)區(qū)間湿硝,例如:
let score = 89
switch score {
case 0:
print("you got an egg")
case 1..<60: //判斷區(qū)間
print("you failed")
case 60..<80:
print("good")
case 80..<90:
print("nice")
case 90..<100:
print("great")
case 100:
print("perfect")
default:
print("error")
}
switch
還可以配合元組使用,例如:
let point = (1, 1)
switch point {
case (0, 0):
print("0, 0")
case (_, 0): //忽略一些內(nèi)容
print("x-axis")
case (0, _):
print("y-axis")
case (-2...2, -2...2): //可以使范圍
print("near the origin")
default:
print("youa are crazy")
}
配合關(guān)鍵字 fallthough
使用:
let point2 = (0, 0)
switch point2 {
case (0, 0):
print("origin")
fallthrough //穿透 case润努,但下層 case 中不能聲明變量
case (_, 0):
print("x-axis")
print("value of x is \(x)")
case (0, let y):
print("y-axis")
print("value of y is \(y)")
case (let x, let y):
print("the point is (\(x), \(y))")
}
配合關(guān)鍵字 where
使用:
let point3 = (2, 2)
switch point3 {
case (let x, let y) where x == y: //where 又增加了限制條件
print("It's on the line x=y")
case let (x, y) where x == -y:
print("It's on the line x=-y")
case let (x, y):
print("the point is (\(x), \(y))")
}
此外关斜,case...where
也可以用在 if
語(yǔ)句中,例如:
let age = 19
switch age {
case 10...19:
print("you're a teenager")
default:
print("you are not")
}
if case 10...19 = age {
print("you're a teenager")
}
if case 10...19 = age where age >= 18 {
print("you're a teenager")
}
- guard 關(guān)鍵字
這是 Swift
中的新特性铺浇,示例代碼:
//一般函數(shù) (func 是定義函數(shù)的關(guān)鍵字)
func buy(money:Int, price:Int, capacity:Int, volume:Int) {
if money >= price {
if capacity >= volume {
print("I can buy it!")
print("¥\(money-price) left")
print("\(capacity-volume) cubic meters left")
}
else {
print("No enough capacity")
}
}
else {
print("No enough money")
}
}
//使用 guard 關(guān)鍵字后的函數(shù)(與前者等效)
func buy2(money:Int, price:Int, capacity:Int, volume:Int) {
guard money >= price else {
print("No enough money")
return
}
guard capacity >= volume else {
print("No enough capacity")
return
}
print("I can buy it!")
print("¥\(money-price) left")
print("\(capacity-volume) cubic meters left")
}
buy(20, price: 12, capacity: 80, volume: 60)
buy2(20, price: 12, capacity: 80, volume: 60)
使用 guard
關(guān)鍵字可以把核心邏輯不相關(guān)的分隔開(kāi)痢畜,使程序條理更清晰。還有其他用法鳍侣,以后再總結(jié)丁稀。
字符串
- 聲明
//聲明字符串
var str = "Hello, playground"
var str:String = "Hello, playground" //顯式聲明
var str = String("Hello, playground")
//聲明空的字符串
var emptyString = ""
var emptyStr = String()
var emptyStr = String("")
- 字符串連接
var mark = "!!!"
str + mark //不改變 str 的值
str += mark //改變 str 的值
- 遍歷
//遍歷字符串中的每一個(gè)字符
for c in str.characters {
print(c)
}
- 索引
var str = "Hello, Swift"
str.characters.count //字符串長(zhǎng)度, 12
var startIndex = str.startIndex //首位字符索引, 0. (閉區(qū)間, 即包含該索引位)
str[startIndex] //獲取首位字符, 即 "H"
str[startIndex.successor()] //獲取后一位對(duì)應(yīng)的字符, 即 "e"
str[startIndex.advancedBy(2)] //距離,類似偏移量, 即 "l"
str.endIndex //末位字符索引, 12. (開(kāi)區(qū)間, 不包含該索引位)
str[endIndex.predecessor()] //獲取末位字符, 即 "t"
str[endIndex] //error, 這樣是錯(cuò)誤的倚聚,越界了
注意:索引是前閉后開(kāi)的线衫,即 [startIndex, endIndex)
增刪字符:
//添加字符到指定位置
str.insert("?", atIndex: endIndex)
//移除最后一個(gè)字符
str.removeAtIndex(endIndex.predecessor())
- 區(qū)間
//Range<Index> 類型,可以移除字符串中的一個(gè)子字符串
var range = startIndex..<endIndex
//移除某個(gè)區(qū)間內(nèi)的字符串 (PS: 這里全部移除了)
str.removeRange(startIndex..<endIndex)
- 常用方法
str.isEmpty //判空
str.characters.count //字符串的長(zhǎng)度(解析字符串長(zhǎng)度時(shí)惑折,一個(gè)漢字或一個(gè)表情都算一個(gè)長(zhǎng)度)
str.uppercaseString //轉(zhuǎn)大寫(xiě)
str.lowercaseString
str.capitalizedString //首字母大寫(xiě)
str.containsString("af") //是否包含某字符串
str.hasPrefix("ca") //判斷前綴
str.hasSuffix("end") //判斷后綴
str.append(mark2) //字符串后添加一個(gè)字符(Character)授账,會(huì)改變 str 變量
str + String(mark2)
str.appendContentsOf("---") //添加字符串
- 轉(zhuǎn)義符
常見(jiàn)的如下:
var s = "\"" //雙引號(hào) "
var t = "\t" //制表符
var n = "\n" //換行符
- 其他
根據(jù)需要保留相應(yīng)的小數(shù)位數(shù):
let s0 = "one third is \(1.0/3.0)" //0.333333333333333
var s1 = String(format: "one third is %.2f", 1.0/3.0) //0.33
格式化字符串:
let s2 = " -- hello --- " as NSString //轉(zhuǎn)為NSString類型
//去除空格和下劃線
s3.stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString: " -"))
總結(jié)自 玩兒轉(zhuǎn)Swift 2.0(第一季)