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条件的旧式方式有所不同.它是否会带来好处,而使用简单的支票是无法获得的?
是否可以在guard函数外部使用?
以下引发了一个需要使用返回或中断的错误,但在这种情况下是不可能的.
var var1 = String?()
guard let validVar = var1 else {
print("not nil")
}
Run Code Online (Sandbox Code Playgroud) 做这样的事情是微不足道的:
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)
它抱怨let或var需要使用,但显然情况并非如此.在Swift 2中执行此操作的正确方法是什么?
所以我喜欢声明变量来保存返回值,然后在下一行返回所述变量,从而轻松调试我的代码,我可以在返回行设置一个断点并查看它返回什么值。我在任何地方都使用它,它使我的所有代码更容易调试。
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) 为什么防护让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) 我正在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,则不会返回空列表吗?最终结果列表的准确度如何?
为什么我需要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)
我在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:我发现的其他信息可以解答它:
不幸的是,一旦你进行发布构建,这将会中断,因为在发布配置中删除了断言,并且一个保护块必须结束当前作用域的执行.
如何在swift中使用'guard'.我已经阅读了很多关于'guard'的文章.但是我没有清楚地了解这个.请给我一个明确的想法.请给我一些关于'if'语句的示例输出.
if firstName != ""
{
if lastName != ""
{
if address != ""
{
// do great code
}
}
}
Run Code Online (Sandbox Code Playgroud) 通过阅读语言指南 (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 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)
但它也失败了。
我正在尝试在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
我是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,则也执行此操作。
guard-statement ×13
swift2 ×7
swift ×5
haskell ×3
ios ×3
if-statement ×1
list ×1
monads ×1
swift3 ×1