2

辞書を拡張し、型の値を持つ NSDate の特定のキー型に制約したいArray<MyClass>

MyClass は、サブクラスのない迅速なクラスです。

extension Dictionary where Key: NSDate, Value: Array<MyClass>{
    func myFunction() -> Int{
        // Some thing useful
    }
}

上記のコードはビルド エラーを返します。

非プロトコル型「配列」に制限された型「値」

わかりましたので、特定のプロトコルに制約する必要があるようですが、奇妙なことに、値を次のように制約すると十分です。

拡張ディクショナリ、キー: NSDate、値: MyClass

コンパイラは文句を言わず、ビルドは成功します。しかし MyClass はプロトコルではありません。それで、何が得られますか?

私はそれを次のように制限することができました:

extension Dictionary where Key: NSDate, Value: CollectionType, Value.Generator.Element: MyClass{
    func myFunction() -> Int{
        var count = 0
        for (_, graphicItemArray) in self{
            count+= (graphicItemArray as! [MyClass]).count
        }

        return count
    }
}

ただし、count プロパティを整数形式で取得する必要があるため、これには強制キャストが必要です。

では、 [MyClass] の値の型に明示的に制約できないのはなぜですか?

4

1 に答える 1

1

where構造体で句を使用できない場合、エラーになる可能性があります。where句の言語リファレンスを確認し、以下に進みます

conformance-requirement → type-identifier­ | ...

type -identifierstructは、使用する例でさえを受け入れる必要があるようですInt

これはおそらくバグを報告するものです。


特定の問題に関連して、必要なメソッドを実装し、持つ_ArrayTypeプロトコルを使用するとうまくいくようです。Array

extension Dictionary where Key: NSDate, Value: _ArrayType ...

そのような内部プロトコルを使用すると、アプリにフラグが立てられ、Apple のレビューに失敗するかどうかはわかりません。

于 2015-09-28T05:57:25.460 に答える