在Swift中有一种更简单的新型闭包语法。任何将闭包作为末尾参数的方法都可以使用Swift的新语法,让回调更简洁,如下:
loginViaHttp(request) { response in if response.success { showMainScreen() } else { showFailedLogin() } } 控制对代码的访问应该坚持用合适的访问控制修饰符(access control modifier)来 封装 代码。如果封装的好,无需记下思维过程,也无需询问代码编写者,就能理解这段代码是如何交互的。
Swift常见的访问控制机制有三种:私人访问、内部访问和公共访问。不过Swift中并没有常见于其它面向对象语言中的protected访问控制修饰符。为什么会这样呢?那是因为在子类中通过新的公共方法或属性,就可以显示protected方法或属性,因此实际上保护是无效的。而且由于从任何地方都能重写,因此protected并未给Swift编译器开启优化的机会。最后,由于protected阻止子类helper访问子类能够访问的信息,会让封装变差。想要了解Swift团队关于protected更多的想法,请点击 这里 查看。
实地实验与验证Playground是苹果在2014年随Swift一起推出的一款交互式编程工具,可以用来测试及验证想法、学习Swift、与其他人分享概念。无需创建新项目,只需在运行Xcode的时候将playground选中就可以了。
也可以在Xcode中创建新的playground:
一旦有了playground,在编程时便能实时看到结果:
通过Playground可以将想法原型化,并以代码形式展示,同时还不会造成开启新项目的额外开销。
安全地使用可选值可选值(optional)属性指的是这个属性或有效值或无值(为空)。通过可选值的名称+感叹号,格式为optionalProperty!,便可隐式解开一个可选值。 一般这是需要避免的,因为感叹号暗示着“ 危险 ”。
不过有些情况下,隐式解开可选值是可以接受的。比如IBOutlets就是默认将可选值隐式解开的(在Interface Builder中点击拖拽时),因为UIKit假定我们是将对象接口(outlet)与IB连接起来的。IBOutlets在初始化之后已经设置好了,因此接口是可选值的,同时根据 ,在初始化之后所有非可选值的属性必须有值。另一个通过名称获得UIImage的案例是存在于我们的asset catalog之中的:
let imageViewSavvyNewYearsParty = UIImageView(image: UIImage(named: "Savvy2016.png")!)将默认值设置为常量属性,在不隐式打开可选值的情况下是无法做到的。也就是说,!仍旧代表“危险!”但在这种情况下,是告知我们需要当心错误,并在运行前验证名称是否相符。一般来讲,假如我们必须使用空值,app就会有崩溃的风险。用!来隐式打开值会让编译器知道,我们已经知道在运行时可选值不会为空。在几乎所有场景之中,这都是带有赌博性质的,因此最好使用if let模式来确定可选值是有有效值还是为空:
if let name = user.name { print(name) } else { print("404 Name Not Found") } 抛弃数字对象(NSNumber)
Objective-C使用C primitives来代表数字,用Foundation Objective-C API来提供数字对象类型,将primitives装箱拆箱。需要在primitives与对象类型之间切换时,代码会像 [array addObject:@(intPrimitive)]和[array[0] intValue]这样。Swift就不会有这种不当的机制。相对的,我们实际上可以向Swift字典和数组中添加Int / Float / AnyObject值。
下面是代替数字对象的一些Swift最常用的类型:
Swift: Objective-C
Int: [NSNumber integerValue]
UInt: [NSNumber unsignedIntegerValue]
Float: [NSNumber floatValue]
Bool: [NSNumber boolValue]
Double: [NSNumber doubleValue]