2015-11-18 5 views
9

私はtypealiasを持っている:スイフトでは、タタリアスをどのように延長するのですか?

typealias BeaconId = [String: NSObject] 

私は同じような何かをすることによってそれを拡張したいと思います:

extension BeaconId {} 

しかし、これはコンパイルエラーがスローされます。

Constrained extension must be declared on the unspecialized generic type 'Dictionary' with constraints specified by a 'where' clause

だから私は終わりますすること:

extension Dictionary where Key: StringLiteralConvertible, Value: NSObject {} 

これを行うためのよりクリーンな方法がありますか?

+1

「拘束拡張子は 『どこ』句で指定された制約と非特殊ジェネリック型 『辞典』に宣言する必要があります」: '制約拡張を宣言する必要があります指定されていないジェネリック型 'Dictionary'の 'where' cl ause' – BallpointBen

+0

ええ、私もそれを得た、あなたは私の完全な答えを以下でチェックアウトすることができます。基本的には、指定されたジェネリック型を拡張することはできないように見えますが、ジェネリック型はまだ設定されていません。 – barndog

+0

@Robert私がSwift 3で見たいと思っているのは、プロトコルや継承の制約だけでなく、値のようなもので、拡張SomeEnum where Self == .MyCase'のようなものです。そのようにして、機能は特定の列挙ケースでのみ定義できます。 – barndog

答えて

2

AFAIK、no。

は、次の例を考えてみましょう。

typealias Height: Float 

extension: Height { 

} 

Heightは、それはあなたがちょうどFloatを拡張しているFloatのためだけに、ラベルの、新しいタイプではありません。あなたはDictionaryで見てみるならば、それはとてもpublic struct Dictionary<Key : Hashable, Value> : CollectionType, DictionaryLiteralConvertible何あなたが

extension BeaconID {} 

で達成しようとするだろうことは、特定の一般的なパラメータでDictionaryに拡張子を追加しています。

私はあなたが行うことができるはずという期待がある。

typealias BeaconID = Dictionary<Key: String, Value: NSObject> 

が、それはまた、コンパイルされないとスウィフトにあなたがすることなく、部分的なタイプ(つまり、一般的なタイプをtypealiasすることはできませんので、それはです詳細な情報はhereを参照してください)。 :私は

struct Wrapper<Key: Hashable, Value> { 
    typealias T = Dictionary<Key, Value> 
} 
typealias BeaconID = Wrapper<String, NSObject>.T 

であるためにリンクされていますがBeaconIDを拡張しようとすると、その後も、あなたは最終的には、問題の核心になるコンパイラの警告を、取得の答えの下に注目されるジェネリック型をtypealiasingための回避策

私はあなたのコードをクリーンアップしようとし、実際にこのエラーを得た

関連する問題