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