最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Swift函數(shù)提前返回實例詳解

 更新時間:2018年09月23日 10:48:06   作者:極小光  
函數(shù)相當重要的,下面這篇文章主要給大家介紹了關于Swift函數(shù)提前返回的相關資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

簡評:

函數(shù)是一個組織在一起語句集合,以執(zhí)行特定任務。Swift 函數(shù)類似于簡單 C 函數(shù)以及復雜的 Objective C 語言函數(shù)。 它使我們能夠通過函數(shù)調用內部的局部和全局參數(shù)值。 像其他任何語言一樣 swift 函數(shù)也遵循相同的步驟。

  • 函數(shù)聲明:它告訴編譯器有關的函數(shù)的名稱,返回類型和參數(shù)。
  • 函數(shù)定義:它提供函數(shù)的實際主體。

Swift 函數(shù)包含參數(shù)類型和返回類型。

函數(shù)提前返回主要的好處是:將每個錯誤處理進行分離,審查代碼時不需要考慮多種復雜異常,我們可以吧注意力集中在也業(yè)務邏輯中,調試代碼時可以直接在異常中打斷點。

提前返回

首先來看一下需要改進的代碼示例,我們構建一個筆記應用使用 NotificationCenter API,當筆記內容有變化時 Notification 來通知筆記列表變更,代碼如下:

class NoteListViewController: UIViewController {
@objc func handleChangeNotification(_ notification: Notification) {
let noteInfo = notification.userInfo?["note"] as? [String : Any]

if let id = noteInfo?["id"] as? Int {
if let note = database.loadNote(withID: id) {
notes[id] = note
tableView.reloadData()
}
}
}
}

上面的代碼可以很好的工作,但是可讀性差了點。因為這段代碼包含多重縮進和類型轉換。我們來嘗試改進這段代碼。

  • 將方法提前返回,讓我們函數(shù)盡可能的快的返回。
  • 使用 guard 替代 if,以避免嵌套。
class NoteListViewController: UIViewController {
@objc func handleChangeNotification(_ notification: Notification) {
let noteInfo = notification.userInfo?["note"] as? [String : Any]

guard let id = noteInfo?["id"] as? Int else {
return
}

guard let note = database.loadNote(withID: id) else {
return
}

notes[id] = note
tableView.reloadData()
}
}

將函數(shù)提前返回能夠將功能失敗的情況處理得更加清晰,這不僅提高了可讀性(更少的縮進,更少的嵌套),同時也有利于單元測試。

我們可以進一步改進代碼,將獲取 noteID 和類型轉換的代碼放在 Notification Extension 中,這樣就將 handleChangeNotification 業(yè)務邏輯和具體細節(jié)分離開來。修改后代碼如下所示:

private extension Notification {
var noteID: Int? {
let info = userInfo?["note"] as? [String : Any]
return info?["id"] as? Int
}
}

class NoteListViewController: UIViewController {
@objc func handleChangeNotification(_ notification: Notification) {
guard let id = notification.noteID else {
return
}

guard let note = database.loadNote(withID: id) else {
return
}

notes[id] = note
tableView.reloadData()
}
}

這種結構還大大簡化了調試的難度,我們可以直接在每個 guard 中 return 中添加斷點來截獲所有失敗情況,而不需要單步執(zhí)行所有邏輯。

條件構造

當構造一個對象實例,非常普遍的需求是需要構建哪類對象取決于一系列的條件。

例如,啟動應用程序時顯示哪個 view controller 取決于:

  • 是否已經(jīng)登錄。
  • 用戶是否已經(jīng)完成入職流程(onboarding flow)。

我們對這些條件的的實現(xiàn)可能是一系列的 if 和 else 語句,如下所示:

func showInitialViewController() {
if loginManager.isUserLoggedIn {
if tutorialManager.isOnboardingCompleted {
navigationController.viewControllers = [HomeViewController()]
} else {
navigationController.viewControllers = [OnboardingViewController()]
}
} else {
navigationController.viewControllers = [LoginViewController()]
}
}

同樣的提前返回和 guard 語句可以提升代碼可讀性,但是現(xiàn)在這種情況不是處理失敗情況,而是在不同條件下構建不同 view controller。

現(xiàn)在來改進這段代碼,使用輕量級的工程模式,將構造初始界面移動到專門的函數(shù)中,該函數(shù)返回匹配條件的view controller。如下所示:

func makeInitialViewController() -> UIViewController {
guard loginManager.isUserLoggedIn else {
return LoginViewController()
}

guard tutorialManager.isOnboardingCompleted else {
return OnboardingViewController()
}

return HomeViewController()
}

func showInitialViewController() {
let viewController = makeInitialViewController()
navigationController.viewControllers = [viewController]
}

由于 makeInitialViewController 方法是個純函數(shù)(不影響外部狀態(tài),固定輸入能夠得到固定輸出),實際上影響外部狀態(tài)的只有一個地方 navigationController.viewControllers = [viewController] ,(在日常開發(fā)中狀態(tài)如果沒有得到很好的控制很容易引起 bug,所以使用更少狀態(tài)和減少對狀態(tài)的修改可以一定程度上減少 bug 出現(xiàn)的幾率)。

條件控制

最后我們來看看,函數(shù)如何簡化復雜的條件邏輯。我們來構建一個 view controller 來顯示社交應用的評論功能,如果滿足三個條件則運行用戶對評論進行編輯。代碼如下:

class CommentViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()

if comment.authorID == user.id {
if comment.replies.isEmpty {
if !comment.edited {
let editButton = UIButton()
...
view.addSubview(editButton)
}
}
}

...
}
}

這里使用了 3 個 if 嵌套邏輯,每次重新審查代碼都會比較困擾,更具之前的經(jīng)驗我們可以對代碼進行優(yōu)化,添加 Comment extension:

extension Comment {
func canBeEdited(by user: User) -> Bool {
guard authorID == user.id else {
return false
}

guard comment.replies.isEmpty else {
return false
}

return !edited
}
}

class CommentViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()

if comment.canBeEdited(by: user) {
let editButton = UIButton()
...
view.addSubview(editButton)
}

...
}
}

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關文章

  • Swift實現(xiàn)復數(shù)計算器

    Swift實現(xiàn)復數(shù)計算器

    這篇文章主要為大家詳細介紹了Swift實現(xiàn)復數(shù)計算器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • swift5.3 UIColor使用十六進制顏色的方法實例

    swift5.3 UIColor使用十六進制顏色的方法實例

    這篇文章主要給大家介紹了關于swift5.3 UIColor使用十六進制顏色的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • Swift?Error的處理方法說明

    Swift?Error的處理方法說明

    wift?是一個類型嚴格的語言,在很多情況下各種不匹配或者強制解包出錯都會導致系統(tǒng)崩潰。所以我們需要進行異常處理,在swift中也叫錯誤處理Error
    2022-08-08
  • Swift使用CollectionView實現(xiàn)廣告欄滑動效果

    Swift使用CollectionView實現(xiàn)廣告欄滑動效果

    這篇文章主要為大家詳細介紹了Swift使用CollectionView實現(xiàn)廣告欄滑動效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • Swift重構自定義空等運算符 “??=” 實例

    Swift重構自定義空等運算符 “??=” 實例

    這篇文章主要為大家介紹了Swift重構自定義空等運算符 “??=” 實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • swift版webview加載網(wǎng)頁進度條效果

    swift版webview加載網(wǎng)頁進度條效果

    這篇文章主要為大家詳細介紹了swift實現(xiàn)webview加載網(wǎng)頁進度條效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Swift實現(xiàn)表格視圖單元格單選(2)

    Swift實現(xiàn)表格視圖單元格單選(2)

    這篇文章主要為大家詳細介紹了Swift實現(xiàn)表格視圖單元格單選的第二篇,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 在 Swift 中測試 UIAlertController的方法

    在 Swift 中測試 UIAlertController的方法

    這篇文章主要介紹了在 Swift 中測試 UIAlertController的方法的,需要的朋友可以參考下
    2015-10-10
  • swift使用SDPhotoBriwser瀏覽圖片教程

    swift使用SDPhotoBriwser瀏覽圖片教程

    這篇文章主要為大家介紹了swift如何使用SDPhotoBriwser瀏覽圖片的教程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-10-10
  • 升級到Swift 4.0可能遇到的坑總結

    升級到Swift 4.0可能遇到的坑總結

    這篇文章主要給大家介紹了關于升級到Swift 4.0可能遇到的坑的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用swift4具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2017-11-11

最新評論

饶阳县| 崇义县| 瓦房店市| 巴南区| 惠东县| 岐山县| 浦东新区| 恩平市| 舞钢市| 黔东| 自贡市| 抚远县| 四平市| 桐庐县| 多伦县| 饶阳县| 敦煌市| 苍梧县| 筠连县| 永定县| 林西县| 铜梁县| 新昌县| 台北市| 石首市| 铜陵市| 朝阳区| 都昌县| 宜宾县| 闵行区| 淮滨县| 伊金霍洛旗| 新乡县| 黔西| 多伦县| 儋州市| 南开区| 唐山市| 综艺| 湟中县| 西乌珠穆沁旗|