例如这段代码有效:
var i = 5
var str: String
str = String(i)
但这不是:
str = i as String
另一方面,此代码有效。
let controller : MyViewController
controller = storyboard?.instantiateViewController(withIdentifier: "MyViewController") as! MyViewController
但这不是:
controller = MyViewController(storyboard?.instantiateViewController(withIdentifier: "MyViewController"))
String(i)
用于从另一个值(在本例中为 Int
)创建一个 String
对象。这是从一种类型转换为另一种类型的正确方法。这不是 Actor 。
i as String
是强制转换,而不是转换。转换不会改变实际对象的类型。由于 i
是一个 Int
,您不能简单地将它转换为 String
。当您使用基类或 Any
获取对对象的引用并且您希望有一个变量来指定对象的实际数据类型时,通常会进行转换。
在您的第二个示例中,您声明了一个类型为 myViewController
的变量。大概这是 UIViewController
的子类。使用 as! myViewController
之所以有效,是因为您设置了 Storyboard,表明标识符为 "myViewController"
的 View Controller 确实属于 myViewController
类型。对 instantiateViewController(withIdentifier:)
的调用具有 UIViewController
的返回类型。因此,转换 (as!myViewController
) 允许您指示 UIViewController
确实是一个 myViewController
。如果没有转换,它会失败,因为您不能将 UIViewController
类型的值分配给 myViewController
类型的变量(但您可以相反)。