Swift | 如何理解Optional的!和?
 
很多人在刚上手swift时对于Optional中 ‘!’ 和 ‘?’ 的使用十分不理解,接下来我会谈一谈自己对于这两个符号的使用方式的理解。  先来说说Optional的概念,以方便之后的理解。来看一下下面的代码:  var  a : String  = nil               // 编译错误,String类型不能为nil  var  b : String  = “Hello!”  Swift 中的普通类型不再能设为nil。那如何表示这个值不存在呢?所以引进了Optional的概念:代表 nil 或某个具体的值。例如:  var  c : String ? = nil         var  d : String ? = “Hello!”  String? 就是一个Optional,它既能够被具体类型赋值, 也可以赋值为nil。通过 String 和 Optional的比较,发现Optional 就相当于把具体类型和 nil 打包捆绑在了一起,转变成了一种新的类型。  Optional 有两种声明方法:  var  apple: String ?    var  bread: String !    很多人认为,声明为 String! 的变量表明该变量的值不为 nil。但是,实际上,String! 和 String? 都是有默认值的,且默认值都为nil。我们为它们赋一个初值再打印类型来看看:  var  apple: String ? = “apple”    var  bread: String ! = “bread”  (lldb) p apple ( String ? ) $R0  =  “apple”  (lldb) p bread ( String ? ) $R1  =  “bread”  发现,尽管apple 和 bread 虽然一个是 String? 一个是 String! 但是打印出来都是 String? 类型的。 所以更恰当的理解应该是:String! 只是理解意义上的不为nil,其本质还是一个 Optional,从声明来说它和 String? 完全等价,所以也能够赋值为 nil 。  为了之后叙述方便,我们把定义类似 String? 的称为 Optional(?), 定义类似 String! 的称为 Optional(!)。  Op...