![](https://i-blog.csdnimg.cn/blog_migrate/0e2ca9c39e22643e992d9d1a9dddbc6a.webp?x-image-process=image/format,png)
對許多剛學會 App 開發技術的初學者來說,他們懂得 Swift 語法,也熟悉各種常見功能的 iOS SDK,但在實際開發 App 時,卻常遭遇 2 個問題:
不知如何寫出容易理解和維護的程式。
遇到問題時,想到四五種解法,不知該用哪一種。
要解決這兩個問題,最好的方法莫過於參考大大們的 App 大作,學習模仿他們的程式碼。然而有時神人們可能會採用一些高深莫測的技術,讓初學者難以理解。對初學者來說,也許 Apple 官方的教學電子書會是更好的選擇。因為 Apple 出品,品質自然不在話下,又因是給初學者學習的教學範例,採用的也將是初學者容易理解掌握的做法。
在这里我还是要推荐下我自己建的iOS开发学习群:680565220,群里都是学ios开发的,如果你正在学习ios ,小编欢迎你加入,今天分享的这个案例已经上传到群文件,大家都是软件开发党,不定期分享干货(只有iOS软件开发相关的),包括我自己整理的一份2018最新的iOS进阶资料和高级开发教程
Apple 的電子書提到大部分 App 常見的功能,比方資料的讀取新增修改,資料的儲存,從網路抓取資料等。若能完全掌握書裡介紹的技巧,開發一些基本功能的 App 應該完全不是問題。接下來的文章裡,我將列出一些書裡值得參考模仿的重點,希望能幫助大家更方便抄襲。讓我們一起來模仿 Apple 大大,寫出一手好 Swift!
Intro to App Development with Swift
App Development with Swift
變數,function,型別的命名
開發 iOS App 時,如何為變數,型別,function 命名,一直是件頭大的事。為了清楚表達意思,名字常常以多個單字組成,並以 Camel case 方法命名,每個單字的開頭大寫,第一個單字例外,比方顯示答案的變數 resultAnswerLabel。(camel 的意思是駱駝,當單字的字首大寫,多個單字組合起來時,每個單字的字首就像駱駝的駝峰,十分可愛。)
此方法的好處在於我們更容易看出名稱由哪幾個單字組成,方便看懂名稱的意思。第一個單字的字首小寫,則是因為 Swift 習慣上只有型別名稱的字首大寫。
至於什麼才是好名字,依 Apple 的教學範例,可整理出以下幾點常見的規則:
1. 自訂的類別繼承父類別時,類別名稱以父類別的名稱結尾。
以 ViewController 結尾。
![](https://i-blog.csdnimg.cn/blog_migrate/584d125adbae7c7abaefc84193e6d86d.webp?x-image-process=image/format,png)
2. 畫面上的 UI 元件,其變數名稱結尾和型別有關。
1@IBOutlet weak var questionLabel: UILabel!
1@IBOutlet weak var rangedSlider: UISlider!
3. UI 元件事件觸發的 function 名和事件有關。
1var categories = [String]()
共用資料宣告成型別常數,取名為 shared 或 default。
App 裡有些負責特定功能的物件會在多個頁面使用,比方抓取網路資料的物件。你可將它宣告成只會建立一次的型別常數,省去每次使用時重新生成的麻煩,並享有任何地方皆可方便存取的好處,就像以下例子的 MenuController.shared
iOS SDK 本身就有很多類似例子,比方 URLSession.shared,UIApplication.shared, FileManager.default。
將字串定義成型別常數
開發 iOS App 時,總有某些東西是我們無法避免,必須以字串輸入的,比方 segue ID,cell ID,storyboard ID 等。然而只要你一不小心打錯,將產生非常可怕的後果,輕則功能失效,重則讓 App 閃退,地球毀滅 !
因此,不妨參考 Apple 的做法,將字串定義成型別常數,到時輸入時 Xcode 將幫我們自動完成,一輩子都不會打錯。
讓我們看看以下幾個例子:
1. segue ID 和 cell ID
在 controller 裡以 struct 定義型別 PropertyKeys,宣告屬性儲存 segue ID 和 cell ID。
class AthleteTableViewController: UITableViewController {
struct PropertyKeys {
static let athleteCell = "AthleteCell"
static let addAthleteSegue = "AddAthlete"
static let editAthleteSegue = "EditAthlete"
}
以 struct 定義型別 SegueID, 宣告屬性儲存 segue ID。
struct SegueID {
static let topicPicker = "TopicPickerController"
static let mainShowDetail = "ShowDetail"
static let mainAddNew = "AddNew"
}
2. Storyboard ID
以 struct 定義型別 StoryboardID,宣告屬性儲存 storyboard ID。
struct StoryboardID {
static let main = "Main"
static let mainNC = "MainNC"
static let zoneNC = "ZoneNC"
static let note = "Note"
static let noteNC = "NoteNC"
}
在 controller 裡宣告屬性 storyboardIdentifier 儲存它的 storyboard ID。
class BuildIceCreamViewController: UIViewController {
static let storyboardIdentifier = "BuildIceCreamViewController"
}
3. Notification name
定義Notification.Name 的 extension,宣告屬性儲存自訂的通知名稱。
extension Notification.Name {
static let zoneCacheDidChange = Notification.Name("zoneCacheDidChange")
static let topicCacheDidChange = Notification.Name("topicCacheDidChange")
}
4. Dictionary 的 key。
以 struct 定義型別 NotificationObjectKey,宣告屬性儲存 Notification 的 userInfo 裡自訂的 key。
struct NotificationObjectKey {
static let reason = "reason"
static let recordIDsDeleted = "recordIDsDeleted"
static let recordsChanged = "recordsChanged"
static let newNote = "newNote"