我可以在Swift中将元类对象转换为协议类型吗?

Swift继承了Objective-C的元类概念:类本身也被认为是对象。 Foo类的对象的类是Foo.self ,它的类型是Foo.Type 。 如果FooBar继承,那么Foo.self也可以分配给Bar.Type类型的变量。 这至少有两个好处:

  • 它允许覆盖“静态方法”;
  • 很容易以类型安全的方式创建未知类的实例,而无需使用反射。
  • 我现在特别关注第二个。 为了确保每个人都了解我的经历,以下是一个例子:

    class BaseFoo {
        var description: String { return "BaseFoo" }
    }
    
    class DerivedFoo: BaseFoo {
        override var description: String { return "DerivedFoo" }
    }
    
    let fooTypes: [BaseFoo.Type] = [BaseFoo.self, DerivedFoo.self] // metaclass magic!
    for type in fooTypes {
        let object: BaseFoo = type() // metaclass magic!
        println(object)
    }
    

    现在,我有一个AnyClass对象数组(任何元类实例都可以分配给AnyClass ,就像任何对象可以分配给AnyObject ),并且我想找到哪些实现了给定的协议。 该协议将声明一个初始化器,并且我将像上面的例子那样实例化这个类。 例如:

    protocol Foo {
        init(foo: String)
    }
    
    class Bar: Foo {
        required init(foo: String) { println("Bar initialized with (foo)") }
    }
    
    class Baz {
        required init() { println("I'm not a Foo!") }
    }
    
    let types: [AnyClass] = [Bar.self, Baz.self]
    

    到现在为止还挺好。 现在,问题在于确定类是否实现协议。 由于元类实例是多态的,我希望能够投它们。 但是,我显然错过了一些东西,因为Swift不会让我这样写:

    for type in types {
        if let fooType = type as? Foo.Type {
            let obj = fooType(foo: "special snowflake string")
        }
    }
    

    我得到的编译器错误是:

    错误 :'Foo'与'AnyObject'不相同

    有什么方法可以确定一个元类实例是否代表一个实现协议的类,并且有什么方法可以将该实例转换为协议类型?

    我试图将Foo声明为一个类协议,但它显然是不够的。


    编辑 :我只是试过Any类型,虽然它不会导致语法错误,它崩溃了Swift编译器。


    至于Xcode 7 beta 2和Swift 2,它已经修复。 你现在可以写:

    for type in types {
        if let fooType = type as? Foo.Type {
            // in Swift 2 you have to explicitly call the initializer of metatypes
            let obj = fooType.init(foo: "special snowflake string")
        }
    }
    

    或者,如果您只想type类型Foo.Type ,则可以使用for case

    for case let type as Foo.Type in types {
        let obj = type.init(foo: "special snowflake string")
    }
    
    链接地址: http://www.djcxy.com/p/82931.html

    上一篇: Can I cast a metaclass object to a protocol type in Swift?

    下一篇: How can i play sound in chrome extension