38
votes

I'm trying to create a closure for a protocol type I have, but I'm getting the following error

Static member 'menuItemSorter' cannot be used on protocol metatype 'MenuItem.Protocol'

Here's a reduced version of my code that I'm trying to run in a playground.

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

I'd like to be able to have a class/static var method on MenuItem that can sort menuItems, what's the best way to do this?

1
Your particular configuration may be safe, but consider that the implementation of menuItemSorter is free to access other static requirements of MenuItem, which may not have default implementations. - Hamish

1 Answers

48
votes

Protocols don't have an accessible interface from the rest of your code.

You need to call it from an adhering type:

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

let sorter = BigItem.menuItemSorter