Swift 語(yǔ)法(一)

基本類型

  • 變量和常量

使用 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(第一季)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市惨驶,隨后出現(xiàn)的幾起案子白热,更是在濱河造成了極大的恐慌,老刑警劉巖粗卜,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屋确,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)攻臀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)焕数,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人茵烈,你說(shuō)我怎么就攤上這事百匆。” “怎么了呜投?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)存璃。 經(jīng)常有香客問(wèn)我仑荐,道長(zhǎng),這世上最難降的妖魔是什么纵东? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任粘招,我火速辦了婚禮,結(jié)果婚禮上偎球,老公的妹妹穿的比我還像新娘洒扎。我一直安慰自己,他們只是感情好衰絮,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布袍冷。 她就那樣靜靜地躺著,像睡著了一般猫牡。 火紅的嫁衣襯著肌膚如雪胡诗。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 50,050評(píng)論 1 291
  • 那天淌友,我揣著相機(jī)與錄音煌恢,去河邊找鬼。 笑死震庭,一個(gè)胖子當(dāng)著我的面吹牛瑰抵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播器联,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼二汛,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了主籍?” 一聲冷哼從身側(cè)響起习贫,我...
    開(kāi)封第一講書(shū)人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎千元,沒(méi)想到半個(gè)月后苫昌,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡幸海,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年祟身,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了奥务。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡袜硫,死狀恐怖氯葬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情婉陷,我是刑警寧澤帚称,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站秽澳,受9級(jí)特大地震影響闯睹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜担神,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一楼吃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧妄讯,春花似錦孩锡、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至砌函,卻和暖如春斩披,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背讹俊。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工垦沉, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人仍劈。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓厕倍,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親贩疙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子讹弯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容