对于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')
我不确定这告诉我的是什么。我的意思是,我看了。但我没有看到真正的问题。我查看了Double
对NaN
之类的内容的类型变量的看法,我不确定为什么我不能使用类似的访问者扩展另一种类型。
(我确实在没有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类型的行为模板。
我已经改变了问题的标题。答案是否定的。
答案 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