2017-02-27 50 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 

我希望能夠對菜單項類/靜態無功法,可以排序的菜單項,什麼是做到這一點的最好方法是什麼?

+0

的可能的複製[斯威夫特:提供一個協議擴展默認的協議實現(http://stackoverflow.com/questions/35043292/swift -providing-a-default-protocol-implementation-in-a-protocol-extension) – Hamish

+0

你的特定配置可能是安全的,但考慮'menuItemSorter'的實現可以自由地訪問'MenuItem'的其他靜態需求,這可能會沒有默認實現。 – Hamish

回答

17

協議的代碼其餘部分沒有可訪問的接口。

您需要從貼合型叫它:

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

let sorter = BigItem.menuItemSorter 
+0

謝謝。似乎來自Swift的一個愚蠢的限制。也許我會介紹一個純粹用於靜態的頂級符合類型。 – MattD

+2

@MattD功能沒有錯誤。它違背協議的想法。一個協議不是一個結構體或類,它是類型使用的一種方式,並聲明遵守某些功能集。允許僅由協議擁有的存儲或功能會破壞許多當前的規則,並破壞協議和類之間的任何有意義的差異。 – PeejWeej