diaryNum += 1 // 新的 Swift 去掉了 ++ 符號(hào)
print "Hello Again捻艳!"
print "Welcome to Swift Learning Diary " + String(diaryNum) + " !"
Welcome to Swift Learning Diary 3 !
點(diǎn)擊進(jìn)入 → Swift 學(xué)習(xí)日志 - 目錄/相關(guān)資料
FollowLight 改進(jìn)
print "Still that Silly!"
Still that Silly!
A new Start
雖說已經(jīng)可以逐漸做一些小的增加和改動(dòng)臭增,但是對(duì)于基礎(chǔ)的掌握依舊需要長時(shí)間的練習(xí)髓窜,一遍遍的訓(xùn)練和掌握捍岳。
使用書籍
「Swift 與 Cocoa 框架開發(fā)」
復(fù)習(xí)
2.1 - 2.5
- Tuple槐瑞,元組哎壳,將多個(gè)值捆綁到單個(gè)值中
- 空數(shù)組鸳慈,需要人工指定類型: [Int]()
- Dictionary, key to value. 不同類型也可以
-
0 ..< 10 // 0 到 10 不包含 10拂募,for xx in xxxx
0 … 10 // 0 到 10 包含10 - lf-let 語句用來檢查一個(gè)可選變量是否包含值
- 強(qiáng)大的 switch攘滩,根據(jù) Tuple 進(jìn)行切換帅刊,可以編寫非常特別的 case,僅當(dāng)其中一個(gè)組件與條件匹配時(shí)再進(jìn)行
2.6
- 定義函數(shù)可返回值時(shí)漂问,需要用 “ -> ”
- 函數(shù)僅可返回一個(gè)值赖瞒,但是通過使用 Tuple,可以將多個(gè)值捆綁放入單個(gè)值中
- 在參數(shù)名前面放入 “ # ” 號(hào)蚤假,使得內(nèi)部名字和外部名字相同
- 為函數(shù)單獨(dú)命名了外部名字時(shí)栏饮,調(diào)用時(shí)必須使用這個(gè)外部名稱
-
可變參數(shù),取值數(shù)目可變磷仰,使用方法像數(shù)組一樣 (僅最有一個(gè)參數(shù)可以是可變參數(shù))
func sumNumber(numbers: Int...) -> Int { // Int 后面加 ... 表示為可變參數(shù)
var total = 0
for number in numbers {
total += numbers
}
return total } -
inout袍嬉,直接改變這個(gè)變量中儲(chǔ)存的值。用一個(gè)函數(shù)交換兩個(gè)變量灶平。
func swapValues(inout v1: Int, inout v2: Int) {// 交換兩個(gè)數(shù)的位置}
swapValues(&num1, &num2) - 通過讓函數(shù)捕獲一個(gè)值并多次使用伺通,可以創(chuàng)建用作生成器的函數(shù)(每次調(diào)用時(shí)返回不同值的函數(shù))
2.7
- 閉包,內(nèi)置 sorted 函數(shù)逢享」藜啵可以接受參數(shù),XCode 可以推斷參數(shù)的類型瞒爬,可以儲(chǔ)存在變量中笑诅,調(diào)用方式與函數(shù)相同
- 繼承调缨,包含被繼承類(父類)的所有函數(shù)和屬性,只能有一個(gè)父類(C++ 允許多重繼承)吆你。通過 override 可以重寫父類中的函數(shù)弦叶,用 super.xxx 調(diào)用父類中的對(duì)應(yīng)值。
- 定義計(jì)算屬性:同儲(chǔ)存屬性一樣聲明一個(gè)變量妇多,在后面加入 { 與 }
- 在屬性發(fā)生變化時(shí)運(yùn)行某些代碼伤哺,向?qū)傩蕴砑?strong>觀察器,屬性后面添加 { 與 }者祖,包含 willSet 和 didSet 代碼塊
- 惰性屬性:直到首次訪問時(shí)才會(huì)設(shè)定立莉,關(guān)鍵字 lazy
- 定義協(xié)議:創(chuàng)建一個(gè)屬性和方法清單,與類十分相似七问,但是不提供任何實(shí)際的代碼蜓耻,可以引用任何遵守某一給定協(xié)議的對(duì)象,這個(gè)類的具體類型久無關(guān)緊要了
- 可以擴(kuò)展任意類型械巡,既可以擴(kuò)展自己編寫的 class刹淌,也可以擴(kuò)展內(nèi)置類型
情況:向別人編寫的 class 中添加功能,但不能訪問其代碼或不想浪費(fèi)時(shí)間時(shí)
情況:使用自己編寫的 class讥耗,但希望將其功能劃分到不同部分提高可讀性時(shí) - extension 中只能增加計(jì)算屬性有勾,不能增加自己的儲(chǔ)存屬性
- 將一個(gè)屬性的 setter 聲明為私有的,可以使這個(gè)屬性只讀古程,源文件可以隨便讀取改寫蔼卡,但其他文件只能讀取值
- 利用泛型可以將 class 的類型設(shè)為一個(gè)可變化參數(shù),在之后的調(diào)用中任何類型都可以(class Tree<T> { })
2.8 - 2.End
- Objective-C 中使用 Swift挣磨,在對(duì)象前面增加 @objc
- Swift 中使用 Objective-C, #import
- 蘋果編寫的書:Using Swift with Cocoa and Objective-C
- 內(nèi)存托管:使用時(shí)雇逞,放入內(nèi)存中,不再需要時(shí)茁裙,從內(nèi)存中刪除塘砸。引用計(jì)數(shù)是 Swift 中用來跟蹤對(duì)象是否還在使用的技術(shù),將對(duì)象指定給變量時(shí)增加 1呜达,不再指定減少 1谣蠢,降到 0 時(shí)便從內(nèi)存中刪除
- 需要留意的問題:循環(huán)引用粟耻,兩個(gè)對(duì)象互相引用查近,但未被其他任何部分引用。
- 弱引用來解決挤忙,一種變量霜威,引用一個(gè)對(duì)象,不改變對(duì)象的引用計(jì)數(shù)(關(guān)鍵字 weak)
- countElement 可以計(jì)算任意集合中的元素個(gè)數(shù)(數(shù)組册烈,字典)
- 數(shù)據(jù)模塊:NSData
- 遵循 NSObject 和 NSCoding 協(xié)議下戈泼,可以將對(duì)象轉(zhuǎn)換為數(shù)據(jù)
- 模型-視圖-控制器:MVC
- 將應(yīng)用程序劃分為責(zé)任區(qū)后婿禽,修改將變得更為輕松,通過明確定義哪些對(duì)象負(fù)責(zé)哪些功能大猛,可以更輕松的修改應(yīng)用并使項(xiàng)目結(jié)構(gòu)保持清晰
- 對(duì)象的委托
應(yīng)用程序
- Info.plist 非常重要
- 通過 NSBundle扭倾,無論代碼在哪里,應(yīng)用程序都可以正常工作挽绩,代碼通過這個(gè)類可以知道自己在磁盤上的位置以及如何獲得編譯后的資源
macOS 生命周期
- 首先打開 Info.plist膛壹,系統(tǒng)因而知道編譯后的二進(jìn)制文件在哪里并啟動(dòng)
- 接口對(duì)象:在設(shè)計(jì)時(shí)準(zhǔn)備的,與應(yīng)用成語一起打包的對(duì)——預(yù)先準(zhǔn)備的窗口唉堪,控件和屏幕模聋。存儲(chǔ)在 nib 文件內(nèi)部。
- 從 nib 文件解包一個(gè)對(duì)象時(shí)唠亚,會(huì)發(fā)送 awakeFromNib 消息链方,對(duì)象便可以運(yùn)行代碼。(向 nib 中添加對(duì)象時(shí)便被創(chuàng)建灶搜,保存 nib 時(shí)祟蚀,對(duì)象被冷凍起來,在打開 nib 時(shí)占调,對(duì)象被喚醒暂题,之后便會(huì)發(fā)送消息,讓它知道此時(shí)狀態(tài)已經(jīng)清醒)
- 應(yīng)用程序準(zhǔn)備可以運(yùn)行究珊,向應(yīng)用程序委托發(fā)送 applicationDidFinishLaunching 方法薪者。
- 進(jìn)行運(yùn)行循環(huán),監(jiān)聽一切發(fā)生的事情
- 當(dāng)用戶選擇另一個(gè) APP 時(shí)剿涮,收到 applicationWillResignActive 的消息言津,表示 APP 不再活動(dòng)
- 收到 applicationDidResignActive 方法確認(rèn) APP 的確不再活動(dòng)
分開的原因:切換另一個(gè) APP 時(shí),代碼可以繼續(xù)控制屏幕內(nèi)容的變化取试,再調(diào)用 Will 時(shí)悬槽,程序仍然在屏幕上,當(dāng)不可見時(shí)瞬浓,會(huì)收到 Did 方法 - 用戶回歸 APP 時(shí)初婆,收到類似之前的方法,applicationWillBecomeActive 和 applicationDidBecomeActive
- 最終退出時(shí)(?Q)猿棉,收到 applicationWillTerminate磅叛,最后一次保存文件的機(jī)會(huì)
iOS 生命周期
與 macOS 區(qū)別:
- 屏幕一次只能顯示一個(gè)程序
- 電話,通知欄等會(huì)打斷程序使之變?yōu)楹笈_(tái)程序
生命周期基本相同
- 程序完成加載后萨赁,增加的參數(shù):Dictionary弊琴,包含了有關(guān)為什么啟動(dòng)程序以及如何啟動(dòng)(點(diǎn)擊,分享杖爽,URL)
- 關(guān)于 Resign 方法敲董,macOS 上時(shí) NSNotification 對(duì)象紫皇,而 iOS 上為 UIApplication
退出時(shí)的變化,多任務(wù):
- 按主屏幕按鈕退出后腋寨,程序被掛起聪铺,停止執(zhí)行代碼,內(nèi)存被鎖定
- 程序仍在內(nèi)存中萄窜,沒有退出但停止消耗 CPU 及其他硬件資源
- 當(dāng)開啟的程序需要更多的內(nèi)存時(shí)计寇,程序被終止,不作任何通知
- applicationWillEnterBackground 在程序被移到后臺(tái)后立即被調(diào)用脂倦,程序應(yīng)該在這個(gè)時(shí)候保存所有數(shù)據(jù)
- applicationWillEnterForeground 在程序即將回到屏幕上之前被調(diào)用
- 通過減少程序所用的內(nèi)存(釋放大的對(duì)象番宁,卸載圖像等)來降低被終止的可能性
- 將內(nèi)存降到 16MB 一下:低于這個(gè)量額程序會(huì)被存儲(chǔ)在閃存中,從內(nèi)存中徹底移出赖阻,當(dāng)程序恢復(fù)時(shí)蝶押,再次從閃存芯片的存儲(chǔ)內(nèi)存中重新加載,因此火欧,不會(huì)因?yàn)槠渌麘?yīng)用的內(nèi)存需求而將程序從內(nèi)存中去除
- 程序可以申請(qǐng)?jiān)诤笈_(tái)段時(shí)間運(yùn)行棋电,不超過 10 分鐘,為了讓程序完成一個(gè)需要長時(shí)間運(yùn)行的過程(將大型文件寫回磁盤苇侵,完成下載等)赶盔,時(shí)間結(jié)束后,程序需要告訴 iOS 已完成或者將被終止(不是掛扔芘ā)
- 后臺(tái)獲取與后臺(tái)通知的增加于未,需要專門開啟,設(shè)定的最短間隔喚醒時(shí)間并不一定被 iOS 采納陡鹃,iOS 會(huì)有自己的機(jī)制來避免不必要的損耗
- 音頻類應(yīng)用可以在后臺(tái)持續(xù)播放烘浦;后臺(tái)跟蹤位置的應(yīng)用可以運(yùn)行任意長時(shí)間;網(wǎng)際協(xié)議電話(VoIP)可以定期運(yùn)行
沙盒機(jī)制
- iOS 中一定存在萍鲸,無法抉擇
- macOS 之前可以選擇闷叉,現(xiàn)在一定需要(mac app story 不接受非沙盒的,因此更多的開發(fā)商選擇了官網(wǎng)直接發(fā)售而不是商家 MAS)
沙盒可以將系統(tǒng)級(jí)的文件被隔絕出來避免各種安全性的問題脊阴,哪怕軟件用可以被利用的 bug握侧,因?yàn)樯澈械南拗疲琅f不能改變系統(tǒng)性的東西嘿期,所以杜絕了安全性的問題
- 不可使用私有 API品擎,只能使用文檔中已經(jīng)表明的
About 關(guān)于
這是我的 Swift 學(xué)習(xí)日記,并不是什么高深莫測的玩意兒秽五,只是為了記錄以便日后鞏固等孽查。
/ by Ulysses
/ by o1xhack (wyx)