Swift 快速向下投射对象数组

Swift 快速向下投射对象数组,swift,Swift,as?是一个有条件的向下投射操作(可能会失败,因此返回一个可选的)–您正在尝试向上投射(它永远不会失败,因此您可以自由地进行) 因此,您只需使用作为,就可以自由地向上转换数组,或者依赖类型推断,正如Casey所指出的那样 import Foundation class A: NSObject { } class B: A { } let array = [B(),B(),B(),B()] array as? [A] //this does not works B() as? A /

as?
是一个有条件的向下投射操作(可能会失败,因此返回一个可选的)–您正在尝试向上投射(它永远不会失败,因此您可以自由地进行)

因此,您只需使用
作为
,就可以自由地向上转换数组,或者依赖类型推断,正如Casey所指出的那样

import Foundation

class A: NSObject {

}

class B: A {

}

let array = [B(),B(),B(),B()]

array as? [A] //this does not works

B() as? A // this works
虽然编译器的
A错误不是B的子类型,但在上下文中肯定没有帮助。一个更合适的错误(或者可能只是一个警告)可能是
“as?”将始终成功地将“[B]”转换为“[A]”–您的意思是使用“as”吗?

您还应注意,对于您的示例:

let arrayOfB = [B(),B(),B(),B()]

let arrayOfA = arrayOfB as [A] // cast of [B] to [A] via 'as'

let explicitArrayOfA : [A] = arrayOfB // cast of [B] to [A] via inference of explicit type 

func somethingThatExpectsA(a:[A]) {...}

somethingThatExpectsA(arrayOfB) // implicit conversion of [B] to [A]

您将收到一条编译器警告,说明从“B”到“a”的条件转换总是成功的
。虽然为什么会得到编译器警告,而不是错误,但我不能说。我怀疑这是由于。

as?
是一个条件下推操作(可能会失败,因此返回一个可选的)–并且您正在尝试上推(它永远不会失败,因此您可以自由地进行)

因此,您只需使用
作为
,就可以自由地向上转换数组,或者依赖类型推断,正如Casey所指出的那样

import Foundation

class A: NSObject {

}

class B: A {

}

let array = [B(),B(),B(),B()]

array as? [A] //this does not works

B() as? A // this works
虽然编译器的
A错误不是B的子类型,但在上下文中肯定没有帮助。一个更合适的错误(或者可能只是一个警告)可能是
“as?”将始终成功地将“[B]”转换为“[A]”–您的意思是使用“as”吗?

您还应注意,对于您的示例:

let arrayOfB = [B(),B(),B(),B()]

let arrayOfA = arrayOfB as [A] // cast of [B] to [A] via 'as'

let explicitArrayOfA : [A] = arrayOfB // cast of [B] to [A] via inference of explicit type 

func somethingThatExpectsA(a:[A]) {...}

somethingThatExpectsA(arrayOfB) // implicit conversion of [B] to [A]

您将收到一条编译器警告,说明从“B”到“a”的条件转换总是成功的
。虽然为什么会得到编译器警告,而不是错误,但我不能说。我怀疑这是由于。

因为B是A,您可以放弃条件强制转换并

B() as? A // this works
或者将目标声明为所需的类型,而忽略强制转换

let thing = array as [A]

因为B是A,所以可以删除条件强制转换并

B() as? A // this works
或者将目标声明为所需的类型,而忽略强制转换

let thing = array as [A]

你为什么要这么做?您可以将
B
数组传递给任何需要
A
数组的对象。为什么需要这样做?您可以将
B
数组传递给任何需要
A
数组的对象