2017-02-27 20 views
9

プロトコルメタタイプスウィフトに使用することはできません私は私が持っているプロトコルタイプのためのクロージャを作成しようとしていますが、私は次のエラー静的メンバー

静的メンバを取得しています「menuItemSorter」に関する使用することはできませんプロトコルメタタイプ 'MenuItem.Protocol'

ここに私が遊び場で走ろうとしているコードの縮小版があります。

protocol MenuItem { 
    var order: Int {get} 
} 

extension MenuItem { 
    static var menuItemSorter: (MenuItem, MenuItem) -> Bool { 
     return { $0.order < $1.order } 
    } 
} 

class BigItem : MenuItem { 
    var order: Int = 1 
} 

let bigItems = [BigItem(), BigItem()] 

let sorter = MenuItem.menuItemSorter 

私はメニューアイテムを並べ替えることができたMenuItemのクラス/静的VARの方法を有することができるようにしたいのですが、これを行うための最善の方法は何ですか?

+0

の可能性のある重複した[スウィフト:プロトコル拡張のデフォルトのプロトコルの実装を提供](http://stackoverflow.com/questions/35043292/swift -providing-a-default-protocol-in-a protocol-extension-extension) – Hamish

+0

あなたの特定の設定は安全ですが、 'menuItemSorter'の実装は' MenuItem'の他の静的要件に自由にアクセスできると考えてください。デフォルトの実装はありません。 – Hamish

答えて

17

プロトコルには残りのコードからアクセス可能なインターフェイスがありません。あなたが貼り合わせ型からそれを呼び出す必要が

class BigItem: MenuItem { 
    var order: Int = 1 
} 

let sorter = BigItem.menuItemSorter 
+0

ありがとうございます。スウィフトからの私の愚かな制限と思われる。たぶん、静的にのみ準拠したトップレベルのタイプを紹介します。 – MattD

+2

@MattDバグではありません。それはプロトコルのアイデアに反するものです。プロトコルは構造体またはクラスではありません。これは、型が特定の機能セットを使用し、それを遵守することを宣言する方法です。プロトコルによってのみ所有されているストレージまたは機能を許可すると、現在の多くのルールが破られ、プロトコルとクラスの間に意味のある差異がなくなります。 – PeejWeej

関連する問題