2017-01-14 2 views
0

Я хотел бы иметь реализацию по умолчанию Comparable для протокола, который я объявляю. Ниже дает ошибку Extension of protocol 'Asset' can not have an inheritance clauseРасширение протокола, обеспечивающего соответствие по умолчанию протоколу «Сопоставимый»

protocol Asset { 
    func getPriority() -> AssetPriority 
} 

extension Asset: Comparable { 
    static func < (lhs: Asset, rhs: Asset) -> Bool { 
     return lhs.getPriority() < rhs.getPriority() 
    } 
    static func == (lhs: Asset, rhs: Asset) -> Bool { 
     return lhs.getPriority() == rhs.getPriority() 
    } 
} 

Я знаю, что я могу сделать наследование протокола (без расширения):

protocol Asset: Comparable { 
    func getPriority() -> AssetPriority 
} 

, но тогда я должен снова и снова выполнять одни и те же две функции.

Я не хочу, чтобы каждый актив, чтобы наследовать от общего базового класса (так что поражения цели протоколов ...)

Является ли расширение протокола протокола только пока не поддерживается в Swift 3 (как это для классов)?

ответ

1

Ваш основной протокол должен быть унаследован от Comparable. Затем вы можете добавить стандартную реализацию методов Comparable в расширение.

protocol Asset: Comparable { 
    func getPriority() -> AssetPriority 
} 

extension Asset { 
    static func < (lhs: Self, rhs: Self) -> Bool { 
     return lhs.getPriority() < rhs.getPriority() 
    } 
    static func == (lhs: Self, rhs: Self) -> Bool { 
     return lhs.getPriority() == rhs.getPriority() 
    } 
} 
+0

@DudeOnRock компилируется нормально: http://swiftlang.ng.bluemix.net/#/repl/587abe5eaadcf805dca39a23 – Alexander

+0

@DudeOnRock Но да, 'Asset' не может быть использован как его собственный тип больше, если вам наследовать от 'Equatable' или' Comparable'. Это неполный тип – Alexander

+0

Извините, я слишком быстро оценил ваш ответ ... У меня вместо 'Self' для типов аргументов в расширении был' Asset' вместо 'Self'. Спасибо огромное! – DudeOnRock

Смежные вопросы