【问题标题】:Can I directly access a default static var from the type of a protocol extension?我可以从协议扩展的类型直接访问默认静态变量吗?
【发布时间】:2016-01-27 10:14:38
【问题描述】:

为了 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 组合样式。相反,它只是要添加到结构/类类型的行为模板。

我已更改问题的标题。答案是否定的。

【问题讨论】:

  • dispatch_queue_t 是一个协议,而不是一个结构体。
  • 好的...我刚刚阅读了 Apple 的稀疏文档 (developer.apple.com/library/ios/documentation/Swift/Conceptual/…),搜索了所有 extensionstatic,但没有看到任何说我不能/不应该的东西t 使用静态变量扩展协议。我猜,如果我对 Swift 有更全面的了解,你的提示会让我兴奋不已,但我猜我还没到。

标签: swift types static swift-extensions


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-18
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多