1.Swift 的String 类型是值类型。 如果您创建了一个新的字符串,那么当其进行常量、变量赋值操作,或在函数/方法中传递时,会进行值拷贝。 任何情况下,都会对已有字符串值创建新副本,并对该新副本进行传递或赋值操作。
在实际编译时,Swift 编译器会优化字符串的使用,使实际的复制只发生在绝对必要的情况下,这意味着您将字符串作为值类型的同时可以获得极高的性能。
2. Swift 的nil 和 Objective-C 中的nil 并不一样。在 Objective-C 中,nil 是一个指向不存在对象的指针。在 Swift 中,nil 不是指针——它是一个确定的值,用来表示值缺失。任何类型的可选状态都可以被设置为nil ,不只是对象类型。使用! 来获取一个不存在的可选值会导致运行时错误。使用! 来强制解析值之前,一定要确定可选包含一个非nil 的值。
3.下面的例子使用这种构造器来尝试将一个String 转换成Int :
let possibleNumber = "123"
let convertedNumber = Int(possibleNumber)
// convertedNumber 被推测为类型 "Int?", 或者类型 "optional Int"
因为该构造器可能会失败,所以它返回一个可选类型(optional)Int ,而不是一个Int 。
4.你可以给可选变量赋值为nil 来表示它没有值;
nil 不能用于非可选的常量和变量。如果你的代码中有常量或者变量需要处理值缺失的情况,请把它们声明成对应的可选类型。
如果你声明一个可选常量或者变量但是没有赋值,它们会自动被设置为nil
5.把想要用作可选的类型的后面的问号(String? )改成感叹号(String! )来声明一个隐式解析可选类型。
一个隐式解析可选类型其实就是一个普通的可选类型,但是可以被当做非可选类型来使用,并不需要每次都使用解析来获取可选值。
你在隐式解析可选类型没有值的时候尝试取值,会触发运行时错误。和你在没有值的普通可选类型后面加一个惊叹号一样。
6.空合运算符(a ?? b )将对可选类型a 进行空判断,如果a 包含一个值就进行解封,否则就返回一个默认值b .这个运算符有两个条件:
- 表达式
a 必须是Optional类型
- 默认值
b 的类型必须要和a 存储值的类型保持一致
空合运算符是对以下代码的简短表达方法: a != nil ? a! : b
7. Swift 中的字符在一个字符串中并不一定占用相同的内存空间数量。通过characters 属性返回的字符数量并不总是与包含相同字符的NSString 的length 属性相同。NSString 的length 属性是利用 UTF-16 表示的十六位代码单元数字,而不是 Unicode 可扩展的字符群集。作为佐证,当一个NSString 的length 属性被一个Swift的String 值访问时,实际上是调用了utf16Count 。
8.Swift 的switch 需要包含所有的分支而且不允许有为空的分支,有时为了使你的意图更明显,需要特意匹配或者忽略某个分支。那么当你想忽略某个分支时,可以在该分支内写上break 语句。Swift 中的switch 不会从上一个 case 分支落入到下一个 case 分支中。相反,只要第一个匹配到的 case 分支完成了它需要执行的语句,整个switch 代码块完成了它的执行。如果你确实需要 C 风格的贯穿的特性,你可以在每个需要该特性的 case 分支中使用fallthrough 关键字。
9.们可以使用guard 语句来要求条件必须为真时,以执行guard 语句后的代码。不同于if 语句,一个guard 语句总是有一个else 分句,如果条件不为真则执行else 分句中的代码。
guard let location = person["location"] else { print("I hope the weather is nice near you.") return }
10.检查API有效性
if
|
请发表评论