标签: guard-statement

Swift的守卫关键词

Swift 2引入了guard关键字,可用于确保准备好配置各种数据.我在这个网站上看到的一个例子演示了一个submitTapped函数:

func submitTapped() {
    guard username.text.characters.count > 0 else {
        return
    }

    print("All good")
}
Run Code Online (Sandbox Code Playgroud)

我想知道使用guard是否与使用if条件的旧式方式有所不同.它是否会带来好处,而使用简单的支票是无法获得的?

swift2 guard-statement

190
推荐指数
8
解决办法
11万
查看次数

如何在功能之外使用防护?

是否可以在guard函数外部使用?

以下引发了一个需要使用返回或中断的错误,但在这种情况下是不可能的.

var var1 = String?()
guard let validVar = var1 else {
    print("not nil")
}
Run Code Online (Sandbox Code Playgroud)

swift2 guard-statement

6
推荐指数
1
解决办法
1756
查看次数

在Swift 2中设置多个类属性时保护

做这样的事情是微不足道的:

class Collection {
    init(json: [String: AnyObject]){
        guard let id = json["id"] as? Int, name = json["name"] as? String else {
            print("Oh noes, bad JSON!")
            return
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在那种情况下,我们let用来初始化局部变量.但是,将其修改为使用类属性会导致它失败:

class Collection {

    let id: Int
    let name: String

    init(json: [String: AnyObject]){
        guard id = json["id"] as? Int, name = json["name"] as? String else {
            print("Oh noes, bad JSON!")
            return
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

它抱怨letvar需要使用,但显然情况并非如此.在Swift 2中执行此操作的正确方法是什么?

swift swift2 guard-statement

5
推荐指数
1
解决办法
2007
查看次数

Swift:通过能够捕获 defer 语句中的返回值来使调试更容易

所以我喜欢声明变量来保存返回值,然后在下一行返回所述变量,从而轻松调试我的代码,我可以在返回行设置一个断点并查看它返回什么值。我在任何地方都使用它,它使我的所有代码更容易调试。

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    let cellCount = models.count
    return cellCount
}
Run Code Online (Sandbox Code Playgroud)

但是,在这种情况下,您必须满足多种选择和不同的条件,才能使您的方法有意义。Guard 声明非常适合确保满足某些条件,同时不会引入厄运金字塔

但早期返回的问题是,您从方法中获得至少两个退出点(因为在此上下文中guard需要 a ),这使得调试变得更加困难。return

// Instantiate using dependency injection
private let reachability: ReachabilityProtocol
private let apiClient: APIClientProtocol

    // Returns true if could start login request, else false 
    func loginUser(username: String, password: String) -> Bool {
        defer {
             // Not possible, would be nice! Return value would be an implicitly declared variable
             // exaclty like the …
Run Code Online (Sandbox Code Playgroud)

ios swift guard-statement swift3

5
推荐指数
1
解决办法
1593
查看次数

为什么守护让x = x表现出不同的范围行为?

为什么防护让x = x在一个方法中的行为与外部不同?

下面的示例代码将从Playground中复制出来.

var x:Int? = 3

func foo(x: Int?) {
    guard let x = x else {
        return
    }

     print(x)  // print "3\n"
}

foo(x)

guard let x = x else { 
  throw NSError(domain: "app", code: 0, userInfo: nil)
}

print(x)  // print "Optional(x)\n"
Run Code Online (Sandbox Code Playgroud)

swift2 guard-statement

3
推荐指数
1
解决办法
1048
查看次数

了解保护功能和列表理解

我正在guard从“学习Haskell带来的好处!”一书中学习该功能。由Miran Lipovaca撰写。

对于以下示例:

ghci> [1..50] >>= (\x -> guard('7' `elem` show x) >> return x)
[7, 17, 27, 37, 47]
Run Code Online (Sandbox Code Playgroud)

我知道这guard需要布尔值,如果值是True,则guard ()将其放在最小的默认上下文中并成功。如果值为False,则guard产生失败的一元数值。

但是,我不明白在上面的示例中guard是如何工作的,以创建结果列表[7, 17, 27, 37, 47]x在lambda函数中传递的是1吗?此外,如果('7' `elem` show x)计算结果为False,则不会返回空列表吗?最终结果列表的准确度如何?

monads haskell list-comprehension list guard-statement

3
推荐指数
1
解决办法
55
查看次数

为什么不守护创建unwrapped var?

为什么我需要unwrapped在最终的return语句中解包变量?不是警卫应该处理这个吗?

func test() -> String {
    let fmt = NSNumberFormatter()
    let myValue:Double? = 9.50
    guard let unwrapped = myValue else {
        return ""
    }
    return fmt.stringFromNumber(unwrapped)
}
Run Code Online (Sandbox Code Playgroud)

错误:可选类型'String?'的值 没有打开; 你的意思是用'!' 要么 '?'?return fmt.stringFromNumber(unwrapped)

ios forced-unwrapping swift2 guard-statement

2
推荐指数
1
解决办法
83
查看次数

在guard语句的else块中使用assert

我在Google Analytics的实施说明中遇到了这个问题:

guard let gai = GAI.sharedInstance() else {
    assert(false, "Google Analytics not configured correctly")
}
Run Code Online (Sandbox Code Playgroud)

我从来没有想过可以在else子句中有一个断言,而不返回.这对我来说没有意义,因为断言只会在测试方案中进行评估.那么,为什么编译器不警告它不返回(在发布版本的情况下).

编辑:这是在功能范围内 application(_:didFinishLaunchingWithOptions) -> Bool

编辑2:我发现的其他信息可以解答它:

不幸的是,一旦你进行发布构建,这将会中断,因为在发布配置中删除了断言,并且一个保护块必须结束当前作用域的执行.

https://help.insight.com/app/answers/detail/a_id/120/~/integrating-google-analytics-into-ios-apps-using-swift-4

ios swift guard-statement

2
推荐指数
1
解决办法
221
查看次数

如何在swift中使用guard而不是if

如何在swift中使用'guard'.我已经阅读了很多关于'guard'的文章.但是我没有清楚地了解这个.请给我一个明确的想法.请给我一些关于'if'语句的示例输出.

if firstName != "" 
{
   if lastName != "" 
   {
      if address != "" 
      {
        // do great code
      }
   }
 }
Run Code Online (Sandbox Code Playgroud)

if-statement swift swift2 guard-statement

1
推荐指数
1
解决办法
2111
查看次数

使用= 运算符时,swift 守卫如何确定真假

通过阅读语言指南 (developer.apple.com) 学习 swift 3.1。我了解到在 swift 中赋值运算符 (=) 不返回值。在控制流章节中得到了一个保护语句的例子:

func greet(person: [String: String]) {
    guard let name = person["name"] else {
        return
    }

    print("Hello \(name)!")

    guard let location = person["location"] else {
        print("I hope the weather is nice near you.")
        return
    }

    print("I hope the weather is nice in \(location).")
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果 '=' 运算符不返回值,则:

guard let name = person["name"] else {
    return
}  
Run Code Online (Sandbox Code Playgroud)

守卫如何确定name = person["name"]是真还是假,并根据它转到 else 并返回?

swift guard-statement

1
推荐指数
1
解决办法
3971
查看次数

Swift 2 可选的字符串保护

我正在处理 swift 2.0 中的一个问题

我从 API 获取一个 json 文件,并尝试从中解开一些字符串。

有时这个 json 会给我一个带有场地街道名称的字符串,但有时不会。所以当我尝试这个时

var street = arrRes[indexPath.row]["venueLocation"]!["street"] as! String 
Run Code Online (Sandbox Code Playgroud)

它总是让我的应用程序崩溃,说它为零。当我评论它时,我的应用程序运行完美,但它不显示街道。知道如何在没有任何问题的情况下解开字符串nil吗?

如果尝试过这段代码

var street = arrRes[indexPath.row]["venueLocation"]!["street"] as! String 

if street == "" {
   street = "n/a"
}
Run Code Online (Sandbox Code Playgroud)

但它也失败了。

swift2 guard-statement

0
推荐指数
1
解决办法
306
查看次数

Haskell使用带卫兵的可能吗?

我正在尝试在Haskell中执行以下操作:

 someFunction :: [] -> Int
 someFunction list 
 let a
 | length list == 1 = 10
 | otherwise = 0
 b
 | length list == 1 = 10 
 | otherwise = 0
 in findValues (a+b)
Run Code Online (Sandbox Code Playgroud)

因此,a和b的值将取决于守卫的条件是否得到满足.这种语法一直给我错误,我不知道为什么.我是否需要使用where子句或是否有正确的"let"语法来实现我想要的?

谢谢你的帮助

haskell functional-programming haskell-platform guard-statement haskell-stack

0
推荐指数
2
解决办法
498
查看次数

根据Haskell中的布尔条件执行多个语句

我是Haskell的新手,如果几个布尔值为true,我将尝试执行多个语句。我使用了警卫队尝试了它,但它只执行了第一条正确的语句,然后停止了。我希望它执行所有正确的示例,例如f 5执行gx,然后还执行h x。我尝试使用if语句,但不能。

f x

  | x < 10 = g x

  | x < 15 = h x

  | otherwise = m x
Run Code Online (Sandbox Code Playgroud)

这只是一个简化,实际上我有一个不同的程序。情况不同,我只是想像其他编程语言一样具有多个if语句。因此,在此示例中,如果x <10,则执行某项操作;如果x <15,则也执行此操作。

haskell functional-programming guard-statement

-1
推荐指数
1
解决办法
85
查看次数