在“as!”之后发送类类型作为一个论点

时间:2015-08-12 17:25:24

标签: ios swift class types

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

let vc = vc_from_func_args as! type_from_func_args

我可以通过这样做来传递一个课程来说isMemberOfClass()

let klass: AnyClass = MyClass.self
vc.isMemberOfClass(klass)

但我不能用“as”表达做同样的事情。它给了我一个错误:

klass is not a type

我们如何在“as”之后将类(类型?)作为变量传递?

3 个答案:

答案 0 :(得分:2)

鉴于您的意见,这正是协议的用途。如果你想要一个可以打开pop的东西,那么就要求你的功能。如果您可以轻松列出所需的所有内容,那么只需将它们放入您的协议中即可:

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

func push(vc: Stackable) {
    // do the work
}

如果你真的需要这个UIViewController也恰好是Stackable,那也很好:

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

然后将视图控制器标记为符合Stackable

class SomeViewController: UIViewController, Stackable {
    var parent: UIViewController
    var child: UIViewController
    ...
 }

如果您发现自己做了很多as!AnyClass,那么您可能会在Swift中走错路。

答案 1 :(得分:0)

这样的事情......

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)

你不需要创建一个实例来检查另一个对象是否是一个类:-)但是只使用我上面的代码......它甚至比这个更好

答案 2 :(得分:0)

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

protocol Castable: class {
    func asType<T>(t: T.Type, defaultValue: T?, file: StaticString,
        function: StaticString, line: UWord) -> T?
}

基本上,您可以使用任何类对象并编写myObject.asType(newType)并执行强制转换。如果转换失败,它会将失败记录到控制台,报告您要转换的类型,以及调用方法的文件名,方法名和行号。我用它进行调试。

无论如何,编写asTypedowncast函数的方式,您可以将您要转换的类型作为命名变量传递,这是您原来的问题想要做的事情

downcast提供了CastableasType协议和{{1}}功能的完整代码。