例如,此代码有效:
while ($_row = $rsqueryapproveddata->read()) {
if ( !isset( $list1[ $_row['DATE'] ] ) {
$list1[ $_row['DATE'] ] = [ 'date' => $_row['DATE'] ]
}
$list1[ $_row['DATE'] ] [ $_row['company_id'] ] = $_row['Approved'];
}
$result = array_values($list1);
但这不是:
var i = 5
var str: String
str = String(i)
另一方面,这段代码有效。
str = i as String
但这不是:
let controller : MyViewController
controller = storyboard?.instantiateViewController(withIdentifier: "MyViewController") as! MyViewController
答案 0 :(得分:3)
String(i)
用于从另一个值创建String
对象(在本例中为Int
)。这是从一种类型转换为另一种类型的正确方法。这不是演员。
i as String
是演员,不是转换。转换不会改变实际对象的类型。由于i
是Int
,因此您无法将其转换为String
。当您使用基类或Any
获得对象的引用时,通常会执行转换,并且您希望拥有一个指定对象的实际数据类型的变量。
在第二个示例中,您声明了一个类型为myViewController
的变量。据推测,这是UIViewController
的子类。使用as! myViewController
是有效的,因为您设置了故事板,表明标识符为"myViewController"
的视图控制器的类型为myViewController
。对instantiateViewController(withIdentifier:)
的调用的返回类型为UIViewController
。所以演员表({{1}})允许您指出as! myViewController
确实是UIViewController
。如果没有强制转换,它会失败,因为您无法将myViewController
类型的值分配给UIViewController
类型的变量(但您可以执行相反的操作)。
答案 1 :(得分:1)
问题的标题是:
什么时候使用“< object>
as
< type>“以及何时使用< type>(
< object>)
这两种模式旨在解决非常不同的数据类型问题:
当我们有某种类型的object
时,我们使用前一种语法,但你碰巧知道它是(或者想要测试它是否真的)某个子类的实例那种类型,你需要/想要访问该子类特有的一些属性/方法。
在instantiateViewController
示例中,该方法定义为返回UIViewController
。 instantiateViewController
方法无法知道您的故事板场景是否已将某些UIViewController
子类指定为该场景的“基类”,因此它返回UIViewController
引用。但是您碰巧知道有问题的场景实际上会返回UIViewController
的一些自定义子类,因此您可以downcast作为MyViewController
子类。如果您需要与UIViewController
子类特有的属性/方法进行交互,通常会这样做。
注意,现在,您不使用as
进行向下转换。如果你100%确定知道这个垮台将会成功,你可以使用as!
进行强迫贬低。或者您使用as?
作为一种安全方式来测试演员是否成功(例如使用if let
或guard let
构造)。
当您想要创建其他类型的全新实例时,我们使用后一种语法。
考虑:
let string = String(i)
这实际上是在初始化期间使用String
创建一个新的i
实例。
这在instantiateViewController
示例中没有意义,因为我们不想从该方法返回的内容创建新的MyViewController
实例。相反,我们只想告诉编译器“是的,我知道该方法将返回UIViewController
(或子类)实例,但我碰巧知道它真的是MyViewController
实例。”因此,在这种情况下,我们会使用as!
(或as?
)向下投射。
正如Martin R所指出的那样,还有其他类型的演员表(桥接演员表,Any
和AnyObject
类型的演员表等)。但这与你的特定例子无关。
有关强制转换的一般性讨论,请参阅 Swift编程语言的Type Casting部分。有关桥接类型,id
强制转换等的讨论,请参阅Using Swift with Cocoa and Objective-C