我可以直接从协议扩展的类型访问默认的静态var吗?

时间:2015-10-27 20:07:08

标签: swift types static swift-extensions

对于Swift乐趣,我想我会为GCD构建一些备用的实现API。所以我把它扔进了游乐场:

import Foundation

typealias DispatchQueue = dispatch_queue_t

extension DispatchQueue {
    static var main:DispatchQueue {
        return dispatch_get_main_queue()
    }
}

let main = DispatchQueue.main

但这会在最后一行产生错误:

Static member 'main' cannot be used on instance of type 'DispatchQueue.Protocol' (aka 'OS_dispatch_queue.Protocol')

我不确定这告诉我的是什么。我的意思是,我看了。但我没有看到真正的问题。我查看了DoubleNaN之类的内容的类型变量的看法,我不确定为什么我不能使用类似的访问者扩展另一种类型。

(我确实在没有typealias的情况下尝试了替代,没有区别)

更新:@Kametrixom的答案没有立即给出帮助,但最终可能有所贡献。这就是我要为灯泡继续做些什么。

class Foo {
    static var Bar:Int {
        return 42
    }
}
Foo.Bar --> 42

好的,这很有用,现在是一个结构。

struct Yik {
    static var Yak:Int {
        return 13
    }
}
Yik.Yak --> 13

那太有用了。现在是一个带有扩展默认实现的协议:

protocol Humble { }
extension Humble {
    static var Pie:Int {
        return 23
    }
}
Humble.Pie --> DOES NOT WORK

但是,使用协议扩展类或结构:

extension Foo: Humble { }
Foo.Pie --> 23

这很有效。我犯的错误(我想?)是假设有一个Humble类型的第一类实例附加到它上面的行为,我可以调用它,ala组合风格。相反,它只是一个要添加到struct / class类型的行为模板。

我已经改变了问题的标题。答案是否定的。

1 个答案:

答案 0 :(得分:1)

如果您转到dispatch_queue_t的定义,您会发现它是一个协议:

public typealias dispatch_queue_t = OS_dispatch_queue
public protocol OS_dispatch_queue : OS_dispatch_object {}

这意味着您实际上并未扩展协议本身,而是符合它的类型。这意味着要使它工作,你需要获得某个地方的协议实例,获取它的dynamicType然后你可以调用main

let DispatchQueueT = (dispatch_queue_create("", DISPATCH_QUEUE_SERIAL) as dispatch_queue_t).dynamicType

DispatchQueueT.main