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

我可以将一个元类对象转换为Swift中的协议类型吗?,第1张

概述Swift继承了Objective-C的元类概念:类本身也被认为是对象.类Foo的对象的类是Foo.self,它的类型为Foo.Type.如果Foo继承自Bar,那么Foo.self也可以分配给Bar.Type类型的变量.这至少有两个好处: >它允许覆盖“静态方法”; >以类型安全的方式创建未知类的实例并且不使用反射很容易. 我现在特别关注第二个.只是为了确保每个人都理解我所追求的,这是一个例子: Swift继承了Objective-C的元类概念:类本身也被认为是对象.类Foo的对象的类是Foo.self,它的类型为Foo.Type.如果Foo继承自bar,那么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")    }}

我得到的编译器错误是:

error: ‘Foo’ is not IDentical to ‘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")    }}

或者,如果您只想将类型作为Foo.Type类型,则可以使用case

for case let type as Foo.Type in types {    let obj = type.init(foo: "special sNowflake string")}
总结

以上是内存溢出为你收集整理的我可以将一个元类对象转换为Swift中的协议类型吗?全部内容,希望文章能够帮你解决我可以将一个元类对象转换为Swift中的协议类型吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/web/1034464.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存