多个Swift类型转换语法形式之间有什么区别

时间:2016-11-16 10:37:48

标签: swift syntax casting

当需要在Swift中进行某种类型转换时,我注意到该语言有两种不同的语法形式。我能够写下这个:

arr as [Any]

但也是这样:

[Any](arr)

这些有什么区别?通常,对于任何值v和类型T,我都可以写下所有这些:

Expression  Has type  Behavior
==========  ========  ==============================================
v as  T     T         Compile error if v cannot have type T
v as? T     T?        Evaluates to nil if v does not have type T
v as! T     T         Runtime error if v does not have type T
T(v)        T         ???

问题:语法形式T(v)的名称是什么?它的语义是什么?

1 个答案:

答案 0 :(得分:2)

语法T(v) 不是一种类型转换形式 - 它的 initialisation 。说T(v)会通过调用带有T参数的T init(_:)来创建v的新实例。

对于[Any](arr),这只是Array<Any>.init(arr)的语法糖 - 这是Array init(_:)初始化程序,接受SequenceArray&#39; s Element类型相同的静态类型的元素(在本例中为Any)。它将简单地创建一个包含该序列元素的新数组。