我正在实施基本Functor
// class Functor f where
public protocol Functor {
typealias A
typealias B
typealias FB
// fmap :: (a -> b) -> f a -> f b
func fmap(f: A -> B) -> FB
}
public struct Box<X> {
let value: X
public init(value v: X) {
value = v
}
}
extension Box : Functor {
public typealias A = X
public typealias B = Any
public typealias FB = Box<B>
public func fmap(f: A -> B) -> FB {
return FB(value: f(value))
}
}
如果我没有声明public typealias
,则会弹出错误
Typealias必须声明为public,因为它符合要求 公共协议
该消息没有提供太多线索,为什么需要公开?
答案 0 :(得分:2)
协议的所有成员必须具有与该协议相同的访问权限。由于此要求,所有成员都隐式设置为相同的访问级别。
您的typealias
问题必定是Swift的错误。 typealias
应隐式公开,就像func fmap(_)
是公开的一样。
协议定义中每个要求的访问级别自动设置为与协议相同的访问级别。您不能将协议要求设置为与其支持的协议不同的访问级别。这可确保在采用该协议的任何类型上都可以看到所有协议的要求。
注意如果您定义了公共协议,协议的要求在实施时需要公共访问级别来满足这些要求。此行为与其他类型不同,其中公共类型定义意味着类型成员的内部访问级别。