Ios 在“后发送类类型”;作为&引用;作为论据

Ios 在“后发送类类型”;作为&引用;作为论据,ios,swift,class,types,Ios,Swift,Class,Types,我需要将ViewController作为特定类的VC“读取”,它作为参数发送给函数。所以我需要这样的东西(我们也从函数参数中得到一个类): 通过这样做,我可以将一个类传递给isMemberOfClass(): let klass: AnyClass = MyClass.self vc.isMemberOfClass(klass) 但我不能用“as”这个词做同样的事情。这给了我一个错误: klass is not a type 我们如何在变量“as”之后传递class(type?) if le

我需要将ViewController作为特定类的VC“读取”,它作为参数发送给函数。所以我需要这样的东西(我们也从函数参数中得到一个类):

通过这样做,我可以将一个类传递给isMemberOfClass():

let klass: AnyClass = MyClass.self
vc.isMemberOfClass(klass)
但我不能用“as”这个词做同样的事情。这给了我一个错误:

klass is not a type

我们如何在变量“as”之后传递class(type?)

if let checkedClass: MyFirstClass = vc_from_func_args as? MyFirstClass {
    //It only hits here if it is MyFirstClass
}

if let checkedClass: MySecondClass = vc_from_func_args as? MySecondClass {
    //It only hits here if it is MySecondClass
}

if let checkedClass: MyThirdClass = vc_from_func_args as? MyThirdClass {
    //It only hits here if it is MyThirdClass
}
此外,您还需要实例化一点连线:-)

改变这个

let klass: AnyClass = MyClass.self
vc.isMemberOfClass(klass)
像这样的事情

vc.isMemberOfClass(MyClass)

您不需要创建实例来检查另一个对象是否属于类:-),只需使用上面的代码即可。。。它甚至比这个更好

鉴于您的评论,这正是协议的用途。如果您想要一个可以调用
pop
on的东西,那么将其作为您的功能的一个要求。如果很容易列出您需要的所有内容,那么只需将它们放在您的协议中:

protocol Stackable {
    var parent: UIViewController {get set}
    var child: UIViewController {get set}
}

func push(vc: Stackable) {
    // do the work
}
如果你真的需要它成为一个
UIViewController
,它恰好也是可堆叠的,那也没关系:

func pop<VC: UIViewController where VC: Stackable>(vc: VC) {
    // do the work
}

如果你发现自己做了大量的
as
AnyClass
,您可能在Swift中走错了方向。

我不久前发现了同样的问题,并最终编写了一个
downcast
全局函数和一个名为
Castable
的协议,其中包括
asType
函数:

protocol Castable: class {
    func asType<T>(t: T.Type, defaultValue: T?, file: StaticString,
        function: StaticString, line: UWord) -> T?
}
协议可浇铸:类{
func asType(t:t.Type,defaultValue:t?,文件:StaticString,
函数:StaticString,行:UWord)->T?
}
基本上,您可以获取任何类对象并编写
myObject.asType(newType)
,然后执行强制转换。如果强制转换失败,它会将失败记录到控制台,报告要向和从中强制转换的类型,以及调用方法的文件名、方法名和行号。我使用它进行调试

无论如何,通过编写
asType
downcast
函数的方式,您可以将要强制转换的类型作为命名变量传递,这正是您最初的问题想要做的


downcast
的完整代码、
Castable
协议和
asType
功能可在。

下载
as强制转换是编译时的事情,尝试向它传递运行时表达式是没有意义的。你到底想干什么?嗯。。。我有一些课程,比如说三门。现在我有了三个功能,它们可以做完全相同的事情(为这些VCs设置一些属性),然后在导航堆栈中
pop/push
它们。我需要传递到
pop/push
function
as!VCClassName
以使所有功能正常工作。如果在
as
之后发送任何内容没有意义,我可以从一些
父类
继承所有这些类,并将其放在
as
之后的代码中。是的,要么让它们有一个公共超类,要么让它们都实现一个包含公共方法的协议。嗨,请查看我的答案。。。我想这是最简单的方法:-)我创建了一个实例,只是为了演示如何将其作为var传递,而不是类的原始名称。我知道如何使用if let
,但这里不是这样,因为它与使用三个单独的函数没有区别。使用
if let
我将为它们重复三次代码,就像现在使用单独的函数一样。作为家长,我将尝试一个普通的课程,希望这能有所帮助=)谢谢你的回答。谢谢你的回答和正确的方法。我将深入讨论协议的概念。
class SomeViewController: UIViewController, Stackable {
    var parent: UIViewController
    var child: UIViewController
    ...
 }
protocol Castable: class {
    func asType<T>(t: T.Type, defaultValue: T?, file: StaticString,
        function: StaticString, line: UWord) -> T?
}