Swift 學(xué)習(xí)筆記

Swift更新較快担猛,現(xiàn)在語(yǔ)法也比較穩(wěn)定了擂涛,iOS開(kāi)發(fā) Swift語(yǔ)言肯定是趨勢(shì),所以最近開(kāi)始學(xué)習(xí)Swift已旧,直接swift3.0 入手秸苗。

在看完swift語(yǔ)言之后,自己開(kāi)始寫(xiě)一些簡(jiǎn)單的小demo运褪,在這個(gè)過(guò)程中發(fā)現(xiàn)一些Swift和Objecobt-C的使用差異 持續(xù)更新:

  1. Swift中沒(méi)有 #pragma mark 函數(shù)注釋說(shuō)明惊楼,網(wǎng)上一查玖瘸,Swift不支持這個(gè)了,因?yàn)?pragma mark 是屬于C的語(yǔ)法檀咙,swift中有了新的一些語(yǔ)法雅倒,如://MARK: //FIXME: //TODO

// MARK: - 生成分隔線
// MARK: 說(shuō)明

如果你想自己定義//warning: 或者其他的,可以通過(guò)腳本實(shí)現(xiàn)弧可,在Target -> Build Phases -> + ->New Run Script Phases

TAGS="TODO:|warning:"
echo "searching ${SRCROOT} for ${TAGS}"
find "${SRCROOT}" \( -name "*.swift" \) -print0 | xargs -0 egrep --with-filename --line-number --only-matching "($TAGS).*\$" | perl -p -e "s/($TAGS)/ warning: \$1/"

如下圖:


圖1.png

運(yùn)行之后能在左側(cè)看到警告蔑匣,這個(gè)在我們實(shí)際開(kāi)發(fā)項(xiàng)目中還是比較實(shí)用的,所以這個(gè)必須得加上去棕诵。


圖2.png

這樣項(xiàng)目開(kāi)發(fā) 是不是很清楚了裁良?

2.Optional

**Optional 是Swift中的一種特殊的類(lèi)型,它本身有一個(gè)枚舉的定義校套,簡(jiǎn)單來(lái)說(shuō)就是這個(gè)形式:

Enum Optional {
    case None
    case Some(Wrapped)
}

Swift在變量定義的時(shí)候 var 需要有個(gè)初始值价脾,這是我在沒(méi)看到 Optional之前,以為是Swift的特點(diǎn)笛匙, 看到Optional之后侨把,之后可以像Object-C一樣 可以不用賦值,但需要加上?

如聲明一個(gè) Optional的Int類(lèi)型的變量

var num : Int?

在引用這個(gè)Optional變量的時(shí)候妹孙,需要做特殊的處理座硕,強(qiáng)制解包(使用!) 如下:

num = 2
let total = num! + 2

let possibleString: String? = "An optional string."
let forcedString: String = possibleString!  //需要??來(lái)強(qiáng)制拆包 符合變量定義的時(shí)候有初始值

使用if let 來(lái)安全的操作Optional值涕蜂,只有num存在時(shí)华匾,變量numValue才會(huì)被初始化賦值

if let numValue = num { 
   print(numValue)
}
else{ 
   print("error")
}

3.defer
這個(gè)swift 新增的一個(gè)關(guān)鍵字defer 推遲執(zhí)行 看下下面例子

func testForDefer() {
    print("123")
    defer {
        print("456")
    }
    print("789")
}
testForDefer()

輸出:123 789 456
這個(gè)有點(diǎn)像Java中的 try finally控制語(yǔ)句,在finally中的代碼塊執(zhí)行我們最后想要做的事机隙,Swift中用defer 可以達(dá)到同樣的效果蜘拉,不得不說(shuō)Swift進(jìn)步很多。

4.閉包
嵌套函數(shù)

func makeIncrementor(forIncrement amount: Int) -> () -> Int {
    var runningTotal = 0
    func incrementor() -> Int {
        runningTotal += amount
        return runningTotal
    }
    return incrementor
}

incrementor函數(shù)引用(捕獲)了

當(dāng)前runningTotal變量有鹿,這邊的變量生命周期不會(huì)隨著函數(shù)結(jié)束而停止makeIncrementor 的返回類(lèi)型為 () -> Int,這意味著返回的是一個(gè)函數(shù)

**let incrementByTen = makeIncrementor(forIncrement: 10) **
incrementByTen 不是一個(gè)Int值 : (()) -> Int

可以理解為一個(gè)無(wú)參函數(shù) 旭旭,為了返回Int 可以調(diào)用incrementByTen()

尾隨閉包:閉包必須是參數(shù)列表的最后一個(gè)參數(shù)

func followingClosure(index:Int,closure: () -> Int ){
       print("1")
      print(closure())
}
followingClosure(index: 100, closure:    {
        print("2")
        return 3
})

//括號(hào)之后是個(gè)函數(shù) () -> Int 這是尾隨閉包的意義所在
followingClosure(index: 100) { () -> Int in
    print("2")
    return 3
}

自動(dòng)閉包
自動(dòng)閉包不接受任何參數(shù),被調(diào)用時(shí)會(huì)返回被包裝在其中的表達(dá)式的值葱跋。

var listABC = ["A","B","C"]
let listProvider = { 
   print("autoClosure")
    listABC.remove(at: 0)
}
listProvider() //執(zhí)行這句之后 閉包內(nèi)的函數(shù)才執(zhí)行 通過(guò)這個(gè)控制執(zhí)行的時(shí) 自動(dòng)執(zhí)行代碼 是它的關(guān)鍵所在

逃逸閉包
當(dāng)一個(gè)傳入函數(shù)的閉包在函數(shù)執(zhí)行結(jié)束之后才會(huì)被調(diào)用持寄,這樣的閉包就叫做逃逸閉包。如果一個(gè)函數(shù)的參數(shù)有一個(gè)逃逸閉包娱俺,可以在參數(shù)前加@escaping關(guān)鍵字來(lái)修飾稍味。一個(gè)閉包是逃逸必要的條件是這個(gè)閉包需要存儲(chǔ)在函數(shù)外部

逃逸閉包一般用于異步函數(shù)的回調(diào)
官方例子

var completionHandlers: [() -> Void] = []
func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {
    completionHandlers.append(completionHandler)
}

func someFunctionWithNonescapingClosure(closure: () -> Void) {
    closure()
}

class SomeClass {
    var x = 10
    func doSomething() {
        someFunctionWithEscapingClosure { self.x = 100 }
        someFunctionWithNonescapingClosure { x = 200 }
    }
}

let instance = SomeClass()
instance.doSomething()
print(instance.x)
// 輸出 "200"

completionHandlers.first?()
print(instance.x)
// 輸出 "100"

例子中可以看出:
逃逸閉包類(lèi)中的變量或常量必須顯示指明self,而普通的閉包可以直接使用x荠卷。
從使用的方式地和作用模庐,是不是和Object-C中的block 很像。

最后編輯于
?著作權(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)容