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条件的旧式方式有所不同.它是否会带来好处,而使用简单的支票是无法获得的?
我在Swift网站上看过这个代码,这里有各种帖子,我正在努力掌握基础知识.这条线如何评估?
if let name = optionalName {
Run Code Online (Sandbox Code Playgroud)
我很困惑,因为它不是name ==可选名称,它正在分配值,所以如何报告为真,为什么当你用nil替换john appleseed时它不正确,因为它仍然是相同的?
var optionalName: String? = "John Appleseed"
var greeting = "Hello!"
if let name = optionalName {
greeting = "Hello, \(name)"
}
Run Code Online (Sandbox Code Playgroud) 有什么方法可以简化这个:
var unloadedImagesRows = [String:[Int]]()
private func addToUnloadedImagesRow(row: Int, forLocation:String!) {
if unloadedImagesRows[forLocation] == nil {
unloadedImagesRows[forLocation] = [Int]()
}
unloadedImagesRows[forLocation]!.append(row)
}
Run Code Online (Sandbox Code Playgroud)
Swift是否有一种简单的方法可以检查nil,如果是,则创建一个新对象,所有后续使用都引用该对象?
我正在关注SpriteKit的教程,它有一个IF语句的问题.该线的逻辑如下:如果子弹和小行星发生碰撞,则将其移除.
if body1.categoryBitMask == PhysicsCategories.bullet && body2.categoryBitMask == PhysicsCategories.asteroid {
// remove bullet and asteroid
}
Run Code Online (Sandbox Code Playgroud)
当试图确保小行星(body2.node)在可关闭区域之前可以关闭之前,会出现问题.为此,作者添加了以下内容:
body2.node?.position.y < self.size.height
Run Code Online (Sandbox Code Playgroud)
制作完整的IF声明如下:
if body1.categoryBitMask == PhysicsCategories.bullet && body2.categoryBitMask == PhysicsCategories.asteroid && body2.node?.position.y < self.size.height {
// remove bullet and asteroid
}
Run Code Online (Sandbox Code Playgroud)
显然这条线与Swift 2配合使用,但是Swift 3进行了一次校正,从一个可选的位置改变了位置,并且力量展开了位置.
if body1.categoryBitMask == PhysicsCategories.bullet && body2.categoryBitMask == PhysicsCategories.asteroid && body2.node!.position.y < self.size.height {
// remove bullet and asteroid
}
Run Code Online (Sandbox Code Playgroud)
通过强行展开位置,当三个物体碰撞时,应用程序崩溃了"我认为".在看屏幕时真的很难分辨.
我正在测试下面的代码,我还没有遇到任何问题.你们认为下面的修复工作会起作用吗?我在想的是,如果我确定body2.node不是nil,那么没有理由为什么应用程序应该崩溃,因为在尝试强行打开它时不会遇到nil.
if body1.categoryBitMask == PhysicsCategories.bullet && body2.categoryBitMask == PhysicsCategories.asteroid {
// If the bullet has hit the …Run Code Online (Sandbox Code Playgroud) 有时当我试图将tableview滚动到一行时,我可能会意外地提供一个不存在的部分/行.然后应用程序将崩溃.
self.tableView.scrollToRow(at: IndexPath(row: targetRow, section: targetSection), at: UITableViewScrollPosition.bottom, animated: true);
Run Code Online (Sandbox Code Playgroud)
如何使这个滚动过程崩溃安全?我的意思是,如果我提供不存在的部分/行,我希望UITableView只是忽略它.或者如何在滚动之前检查UITableView中是否存在节/行?谢谢.
有时,我想guard与let&结合使用where来简化我的代码。但我想知道 let 的优先级是什么以及在哪里。例如:
class Person {
func check() -> Bool? {
print("checking")
return nil
}
}
func test(dont: Bool) {
let person = Person()
guard let check = person.check() where dont else {
print("should not check")
return
}
print("result: \(check)")
}
test(false)
Run Code Online (Sandbox Code Playgroud)
正如您所看到的控制台结果,打印输出为:
let check = person.check() where dont对于in语法的条件guard <condition> else { },即使 in 中的表达式where与 in 中表达式的结果无关let,Swift 似乎也是let先执行后检查where。有时在我的代码中,let可选绑定需要大量计算,并且where …
我在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:我发现的其他信息可以解答它:
不幸的是,一旦你进行发布构建,这将会中断,因为在发布配置中删除了断言,并且一个保护块必须结束当前作用域的执行.