2016-05-28 2 views
1

Предположим, у меня есть протокол, какДоступ компьютерной собственности протокола в расширение протокола

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 
    } 
} 

ответ

2

Что вы хотите, вполне возможно, сообщение об ошибке вы получаете только не делает его очень ясно, что проблема: ваш синтаксис расчетному имущества неверен. Вычислительные свойства должны быть явно напечатаны и не использовать знак равенства:

extension TypedString { 
    var hashValue: Int { return self.description.hashValue } 
} 

Это прекрасно работает!

+0

D'oh, спасибо за ответ так быстро :) – Feenaboccles

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