亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Swift > 正文

Swift函數提前返回實例詳解

2020-03-09 17:31:23
字體:
來源:轉載
供稿:網友

簡評:

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

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

Swift 函數包含參數類型和返回類型。

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

提前返回

首先來看一下需要改進的代碼示例,我們構建一個筆記應用使用 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] = notetableView.reloadData()}}}}

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

  • 將方法提前返回,讓我們函數盡可能的快的返回。
  • 使用 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] = notetableView.reloadData()}}

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

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

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] = notetableView.reloadData()}}

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

條件構造

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

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

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

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

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

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

現在來改進這段代碼,使用輕量級的工程模式,將構造初始界面移動到專門的函數中,該函數返回匹配條件的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 方法是個純函數(不影響外部狀態,固定輸入能夠得到固定輸出),實際上影響外部狀態的只有一個地方 navigationController.viewControllers = [viewController] ,(在日常開發中狀態如果沒有得到很好的控制很容易引起 bug,所以使用更少狀態和減少對狀態的修改可以一定程度上減少 bug 出現的幾率)。

條件控制

最后我們來看看,函數如何簡化復雜的條件邏輯。我們來構建一個 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 嵌套邏輯,每次重新審查代碼都會比較困擾,更具之前的經驗我們可以對代碼進行優化,添加 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)}...}}

總結

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


注:相關教程知識閱讀請移步到swift教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美成人免费播放| 亚洲深夜福利在线| 亚洲精品久久久久中文字幕欢迎你| 亚洲精品狠狠操| 国产精品嫩草影院一区二区| 亚洲精品电影网站| 欧美激情第99页| 久久久www成人免费精品张筱雨| 欧美成年人视频网站欧美| 日韩高清免费在线| 欧美国产日韩二区| 国产极品jizzhd欧美| 精品日本美女福利在线观看| 国产精品爱久久久久久久| 日本高清不卡在线| 国内精品久久久久久久| 亚洲综合色av| 中日韩美女免费视频网站在线观看| 亚洲r级在线观看| 最新国产成人av网站网址麻豆| 中文亚洲视频在线| 欧美丰满少妇xxxxx| 久久精品国产电影| 成人黄色激情网| 欧美国产日韩中文字幕在线| 亚洲精品乱码久久久久久按摩观| 亚洲欧美三级伦理| 欧美激情一区二区三级高清视频| 狠狠操狠狠色综合网| 亚洲成年人在线播放| 亚洲欧美日韩另类| 欧美成年人视频| 久久中国妇女中文字幕| 在线播放国产一区中文字幕剧情欧美| 国产一区二区丝袜| 亚洲国产精品女人久久久| 精品综合久久久久久97| 久久综合亚洲社区| 欧美国产在线电影| 精品动漫一区二区| 亚洲色图欧美制服丝袜另类第一页| 国产乱人伦真实精品视频| 日本精品性网站在线观看| 国产一区二区三区在线观看网站| 欧美激情影音先锋| 91探花福利精品国产自产在线| 欧美黑人国产人伦爽爽爽| 亚洲第一色在线| 亚洲国产高潮在线观看| 亚洲九九九在线观看| 色综合久久天天综线观看| 日韩亚洲成人av在线| 欧美福利视频在线观看| 久久久精品999| 亚洲系列中文字幕| 欧洲日本亚洲国产区| 97人人爽人人喊人人模波多| 国产欧美精品日韩精品| 欧美精品九九久久| 国产精品成人免费视频| 亚洲国产精品成人av| 国产精品日韩欧美大师| 91视频88av| 国产欧美一区二区三区视频| 亚洲高清免费观看高清完整版| 欧美亚洲国产精品| 欧美日韩日本国产| 亚洲欧美国产精品专区久久| 欧美精品电影在线| 91av视频在线观看| 亚洲欧美日韩直播| 久久久精品国产一区二区| 大桥未久av一区二区三区| 亚洲美女中文字幕| 国产69精品久久久久9999| 欧美—级a级欧美特级ar全黄| 日韩欧美精品网址| 欧美一级黑人aaaaaaa做受| 精品欧美一区二区三区| 成人网在线观看| 国产精品视频精品视频| 亚洲免费电影在线观看| 国产黑人绿帽在线第一区| 久久久久久久久91| 久久成人综合视频| 久久精品精品电影网| 久久久久免费精品国产| 在线观看视频99| 国产成人精品999| 91精品在线国产| 久久91超碰青草是什么| 久久久久在线观看| 亚洲偷欧美偷国内偷| 北条麻妃一区二区三区中文字幕| 欧美性一区二区三区| 91理论片午午论夜理片久久| 青草青草久热精品视频在线观看| 日韩av网址在线观看| 丰满岳妇乱一区二区三区| 色综合天天综合网国产成人网| 国产一区二区三区中文| 欧美电影第一页| 欧美亚洲第一区| 亚洲欧美三级伦理| 精品爽片免费看久久| 成人淫片在线看| 日韩精品在线视频| 色妞在线综合亚洲欧美| 亚洲国产91色在线| 伊人青青综合网站| 欧美国产精品日韩| 欧美成人精品不卡视频在线观看| 欧美一级片一区| 欧洲精品在线视频| 97在线免费观看视频| 国产精品一区二区av影院萌芽| 日韩精品亚洲精品| 欧美亚洲国产成人精品| 国产精品视频精品| 久久人人爽人人爽人人片亚洲| 欧美—级高清免费播放| 欧美一乱一性一交一视频| 久久久久久久亚洲精品| 欧美限制级电影在线观看| 欧美激情网友自拍| 国产精品第1页| 亚洲人在线观看| 精品国产自在精品国产浪潮| 日韩电影网在线| 日韩av网站大全| 久久国产精品久久国产精品| 成人国产精品一区二区| 51精品国产黑色丝袜高跟鞋| 亚洲淫片在线视频| 国产精品视频最多的网站| 91视频免费网站| 一区二区三区美女xx视频| 一本色道久久88亚洲综合88| 中国日韩欧美久久久久久久久| 日韩视频中文字幕| 国产一区视频在线播放| 91精品视频播放| 日韩精品中文字幕在线| 精品国产户外野外| 欧美性猛交xxxx乱大交3| 亚洲人成在线一二| 91久久精品视频| 亚洲电影免费观看高清| 国产精品精品一区二区三区午夜版| 日韩亚洲综合在线| 亚洲国产精品久久91精品| 亚洲精品小视频| 97视频在线观看亚洲| 亚洲欧美日韩爽爽影院| 亚洲国产高清自拍| 亚洲人成网站在线播| 国产成人在线精品| 欧美午夜女人视频在线| 岛国精品视频在线播放| 亚洲成人精品av| 成人高h视频在线| 九九精品在线视频| 久热精品视频在线| 亚洲精品久久久久中文字幕欢迎你|