>

[Swift 2.0] 为什么澳门新葡亰平台游戏: guard 比

- 编辑:澳门新葡亰平台游戏 -

[Swift 2.0] 为什么澳门新葡亰平台游戏: guard 比

let personViewModel = PersonViewModel(name: "Taylor Swift", age: "25")if let person = personViewModel.createPersonNoGuard() { // DO SOMETHING IN ANOTHER PYRAMID OF DOOM HERE}
声明: 
      1>  guard  必须使用在函数里面
      2> guard  语句必须带有else语句   
语法如下:
       · 当条件表达式为 true 时跳过 else 语句内容,执行语句组内容
       · 条件表达式为 false 时执行 else 内容, 跳过语句一般为 return 、break、continue、throw.

例子:
  // 如果一个人想去网吧玩游戏  要检查他是否成年,是否带有身份证
    func check(_ age: Int, idCard: Bool){
        // 传统逻辑判断 首先判断有没有18岁
        if age >= 18 {
            // 继续判断有没有带身份证
            if idCard {
                print("可以上网")
            }else{
                print("没带身份证")
            }
        }else{
            print("未成年人")
        }
    }

    // 使用 guard 判断
    func check(_ age: Int, idCard: Bool){
        // 当 age 条件不满足时 直接跳出 不在执行接下来的操作
        guard age >= 18 else {
            print("未成年人")
            return
        }
        // 当 age 满足条件 idCard 不满足条件时 也不在执行接下来的操作
        guard idCard else {
            print("没带身份证")
            return
        }
        // 两个条件都满足
        print("可以上网")
    }
    // 两个对比 guard 在逻辑判断中比 if 简便
    // 但个人习惯问题 还是自己选择自己能懂的逻辑

}

上边介绍在createPerson()方法中使用guard的好处:

     guard语句,类似于if语句,基于布尔值表明式来执行语句。

使用if语句编写createPerson()时,大家须要限制再次来到值的境况。

假定guard语句的口径被满意,代码会继续施行直到guard语句后的花括号。任何在基准中央银行使可挑选绑定而赋值的变量恐怕常量在guard所在的代码块中随后的代码里都以可用的。

那是个风趣的标题,所以究竟怎么guard就是比if要好呢?让大家来好好剖析一下……

func   updateDemo() {

 func createPerson() throws -> Person { guard let age = age, let name = name where name.characters.count > 0 && age.characters.count > 0 else { throw InputError.InputMissing } guard let ageFormatted = Int else { throw InputError.AgeIncorrect } return Person(name: name, age: ageFormatted) }

     guard  prefill == true else { return }

终极,最棒玩的是,和别的编制程序语法(中近乎 if 和 guard 的口舌)相比较,使用 guard 会强迫你编写 happy-path,假使出错会提前退出,进而必需管理大概产生的失实。那让小编想到了幽冥的 Railway Oriented Programming 话题。

//    do something.......

guard 还会有啥样重要的性状呢,请在商议中告诉本身!

let  prefill = true

你会四处编写正确的代码,程序一旦运转出错就能提前退出。那是一种十二分美貌的处理代码的办法,未有其他复杂的函数语法。看下边这段代码,你能马上开掘happy-path :

    使用guard语句来供给二个标准必得是真工夫实行guard之后的说话。与if语句区别,guard语句总是有二个else分句——else分句里的代码会在基准不为真的时候实践。

do { let person = try personViewModel.createPerson() print("Success! Person created. \\} catch PersonViewModel.InputError.InputMissing { print("Input missing!")} catch PersonViewModel.InputError.AgeIncorrect { print("Age Incorrect!")} catch { print("Something went wrong, please try again!")}

更加多优异译文请关怀大家的微信公众号:learnSwift

这种 Haskell 格局的回来枚举值的化解办法还不易,但此间回来了二个PersonResult,实际不是 Person,那就代表你能够忽略再次回到的荒唐结果。

struct Person { let name: String var age: Int}struct PersonViewModel { var name: String? var age: String? enum InputError: ErrorType { case InputMissing case AgeIncorrect } func createPerson() throws -> Person { guard let age = age, let name = name where name.characters.count > 0 && age.characters.count > 0 else { throw InputError.InputMissing } guard let ageFormatted = Int else { throw InputError.AgeIncorrect } return Person(name: name, age: ageFormatted) }}

于是在动用 guard 的时候,须求用如此的语法捕捉错误新闻:

澳门新葡亰平台游戏 1

但假诺您想让这几个主意更完美一些,就供给插足错误提醒,再次回到错误时报告使用者表格音讯不完整。那时,你需求将代码改成这么:

下边是贰个很卓绝的例证--令人想鞭尸的 Swift金字塔。那个是行使if语句写出来的createPerson()方法:

 func createPersonNoGuard() -> Person? { if let age = age, let name = name where name.characters.count > 0 && age.characters.count > 0 { if let ageFormatted = Int { return Person(name: name, age: ageFormatted) } else { return nil } } else { return nil } }

现行反革命我们有了新的 guard 语句,这就象征再次来到值一定是一个 Person 对象,並且编写翻译器会供给您不可小看理回来错误的情况:

if case .Success(let person) = personResult { print("Success! Person created")}// Error case not addressed

Swift 2.0 带来了令人激动的guard言辞。但过三个人照旧不太知道guard的含义,极其是和 斯维夫特 2.0 以前的轻松if语句绝相比。

当然了,鞭尸金字塔在 斯威夫特 1.2中得以行使一行代码管理可选值,那样会好一点,但一些也不顺眼,何况很难一眼就知晓这么些格局的意思(其实便是创建了一个Person 的实例)。

本身的接头是内需重回一个 optional Person (那几个 Person 实例也是有也恐怕未有)。在调用那么些法子的时候就要加上一层鞭尸金字塔来拍卖回来的结果:

 enum PersonResult { case Success case Failure(errorText: String) } func createPersonNoGuard() -> PersonResult { if let age = age, let name = name where name.characters.count > 0 && age.characters.count > 0 { if let ageFormatted = Int { let person = Person(name: name, age: ageFormatted) return PersonResult.Success } else { return PersonResult.Failure(errorText: "The age is invalid!") } } else { return PersonResult.Failure(errorText: "Information is Missing!") } }

原著链接:Swift 2.0: Why Guard is Better than If

澳门新葡亰平台游戏 2

那边我们利用另一篇博文 错误处理中的例子,一个蕴涵姓名和年龄的大致表格。在起来在此以前大家先来看下那一个例子。

和方面包车型地铁 guard 完成相比较,使用 guard 可以很轻巧地见到 Person 实例的再次来到值,那样就会领略这么些法子的非常重要指标是何等。

此番大家要关怀viewModel部分,特别是createPerson()方法:

本文由java编程发布,转载请注明来源:[Swift 2.0] 为什么澳门新葡亰平台游戏: guard 比