2016-12-18 3 views
1

DispatchGroupをサブクラス化することはできません。どうすればいいですか?DispatchGroupをサブクラス化できません - "Objective-Cランタイムのみで表示可能"?

注:これは最終的にはiOSの10+

例で修正されてい

、グループでステートフルなパッケージを運ぶ、これが中に固定されて指摘してshallowThoughtへ

class PushDispatchGroup: DispatchGroup { 
    var sentIds: [(tableName: String, rowId: String)] = [] 
} 

感謝iOS10

+1

なぜあなたは 'DispatchGroup'をサブクラス化しようとしていますか?おそらくあなたの質問はあなたが達成しようとしているものに関するものでなければなりません。 – rmaddy

+1

あなたのコードはここでうまくコンパイルされます。 'error: 'DispatchGroupPlus'にアクセス可能な初期化子がないので、インスタンスを作成できません。 – shallowThought

+2

@JoeBlowそれはあなたがそれをサブクラス化する必要があるわけではありません。作成する、継承しない。 – Alexander

答えて

3

how to inherit from a class which is 'only visible via the Objective-C runtime'?

あなたはしません。

これは、あなたが考えているように、適切な「オブジェクト」の周りにラップされません。これは、C構造体であるdispatch_groupにラップされています。このクラスはサブクラス化されるようには設計されておらず、通常の方法でObjCにブリッジしないので、サブクラス化することもできません。

低レベルのCタイプは、多くの場合、システムの部品が対処する方法を知っているようにハードコーディングされている非常に珍しい構造を持っている(これはNSStringCFStringなどのフリーダイヤルブリッジとすべての時間に発生し、直接その橋を「オブジェクト」 )。多くの場合、タイプは構造の慎重な選択によってメモリレイアウトが同一になるように設計されています(私はDispatchGroupを選びませんでしたが、このグループのように見えます)。それが当てはまると、メモリのレイアウトが異なり、ブリッジを解除するため、ストレージを追加できません。様々なコメンターが言ったように

、あなたもはがこれを行うにはどのようにのための簡単な答えはありません理由である、これを行うべきではありません。サブクラス化のために明示的に設計されていないクラスは、Swiftでサブクラス化することが意図的に困難または不可能です(これは定期的にDispatchGroupよりトリッキーな型の周りに出現し、その答えは同じです。

+0

"これはCの構造体" ah、fantastic、ありがとう、dispatch_groupの周りにラップされています。 – Fattie

+0

私は@RobNapierに不思議に思っていましたが、(この場合は) 'DispatchGroup'が実際にはCの構造体ラッパーであることをどのように知っていますか? (「定義」をクリックすると、それが何であるかを理解するのに十分なインテリジェントではありません) – Fattie

+0

まず、 'dispatch_group'が存在すること、構造体であること、ARCにブリッジされていること以前はその仕組みを研究しました)。 'DispatchGroup'は' OS_object'です。これは 'libSystem'" fake "オブジェクトの一つであることを意味します。それに関する解説は 'os/object.h'を参照してください。また、なぜこれがいくつかの場所をコンパイルするかもしれないが、他の場所はコンパイルできないことがわかります(例えば10.12で変更されました)。しかし、たとえそれがコンパイルされたとしても、それは非常に危険です(これがエラーを追加した理由です)。 –

関連する問題