3

Swift の楽しみとして、代わりに具体化された API をGCD. だから私はこれを遊び場に投げました:

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 型のファースト クラスのインスタンスが実行されていて、その動作が付加されていると想定したことでした。むしろ、構造体/クラス型に追加される動作の単なるテンプレートです。

質問のタイトルを変更しました。そして答えはノーです。

4

1 に答える 1

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
于 2015-10-27T20:30:26.780 に答える