Swift中Int转Double:为何构造器转换成功而as?类型转换失败?
为什么Swift中两种Int转Double的方式结果不同?
咱们先看你给出的代码片段:
var myVariable = 2 var myDoubleTest1 = Double(myVariable) var myDoubleTest2 = myVariable as? Double print(myDoubleTest1) // 2.0 print(myDoubleTest2) // nil
这两种写法看起来都是把Int转成Double,但本质完全是两回事:
第一种
Double(myVariable):数值转换
这是调用了Double类型的初始化器,Swift为数值类型(比如Int、Float、Double)提供了专门的初始化方法,用来在不同数值类型之间做值的转换。因为Int的所有可能值都能被Double精确表示,所以这个初始化一定会成功,返回的是一个非可选的Double值,也就是你看到的2.0。第二种
myVariable as? Double:类型转换(Casting)
这里的as?是Swift里的类型转型操作符,它的作用是检查某个实例是否属于某个特定的类型(或者该类型的子类),但Int和Double是完全独立的两种值类型,它们之间没有继承关系,也不属于同一个类型族,所以这种转型是完全不成立的。Swift没办法把一个Int实例“变成”Double实例,所以转型失败,返回nil。
简单总结:前者是值的转换,通过初始化器生成了一个新的Double值;后者是类型的检查/转换,因为两种类型完全不兼容,所以失败返回nil。
内容的提问来源于stack exchange,提问作者Martin Muldoon
相关产品推荐
相关产品推荐

