.非兼容类型的转换,由各个类自己的初始化方法实现....比 js 的 || 好使多了,因为前者能准确区分零值和nil值.只有nil值时,才需要使用默认值.
* names[0..数组. ==> 本质上,应该是 array 的[]操作符...在调用 super.init 之前,不能调用任何实例方法,因为对象还没有效初始化.
* 用 closure 指定默认值和属性的get/set 方法的区别在于 声明有个等号(=),说明前者是个赋值操作....类似.
* 数组具体化类型声明为 Any / AnyObject 时,数组内可同时存放多种类型不兼容的实例....,如 AP&BP&CP.
* protocol 可以在 extension 中定义自己的方法,任意遵循此协议的类型的实例都可以调用此协议自己的方法实现. --> 可以在 extension 实现协议规定的属性或方法的默认实现