Предположим, у меня есть протокол, какДоступ компьютерной собственности протокола в расширение протокола
protocol TypedString : CustomStringConvertible, Equatable, Hashable { }
func == <S : TypedString, T : TypedString> (lhs : T, rhs : S) -> Bool {
return lhs.description == rhs.description
}
Я хочу, чтобы быть в состоянии обеспечить реализацию по умолчанию Hashable
:
extension TypedString {
var hashValue = { return self.description.hashValue }
}
Но проблема в том, что я получаю ошибку Use of unresolved identifier self
.
Как создать стандартную реализацию Hashable
с использованием строкового представления, заданного свойством description
, определенным в протоколе CustomStringConvertible
?
Мотивация Я хочу, чтобы создать мелкие обертки вокруг строк, так что я могу семантически проверять тип мой код. Например, вместо написания func login (u : String, p : String) -> Bool
я бы вместо этого написал func login (u : UserName, p : Password) -> Bool
, где инициализаторы (failable) для UserName
и Password
делают проверку. Например, я мог бы написать
struct UserName : TypedString {
let description : String
init?(userName : String) {
if userName.isEmpty { return nil; }
self.description = userName
}
}
D'oh, спасибо за ответ так быстро :) – Feenaboccles