繁体   English   中英

协议扩展中协议的访问计算属性

[英]Access Computed Property of a Protocol in a Protocol Extension

假设我有一个类似的协议

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

如何使用CustomStringConvertible协议中定义的description属性给出的字符串表示形式创建Hashable的默认实现?


这样做的动机是我想在String周围创建浅层包装,因此我可以在语义上对我的代码进行类型检查。 例如,不是编写func login (u : String, p : String) -> Bool ,而是编写func login (u : UserName, p : Password) -> Bool ,其中UserNamePassword的(失败)初始化程序进行验证。 例如我可能写

struct UserName : TypedString {
    let description : String

    init?(userName : String) {
        if userName.isEmpty { return nil; }

        self.description = userName
    }
}

您想要的是完全可能的,您收到的错误消息并不能很清楚地说明问题是什么:您的计算属性语法不正确。 计算属性需要显式键入,并且不要使用等号:

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

这样很好!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM