必须将Typealias声明为public,因为它与公共协议中的要求匹配

时间:2015-09-27 01:52:34

标签: swift protocols public functor type-alias

我正在实施基本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,因为它符合要求   公共协议

该消息没有提供太多线索,为什么需要公开?

1 个答案:

答案 0 :(得分:2)

协议的所有成员必须具有与该协议相同的访问权限。由于此要求,所有成员都隐式设置为相同的访问级别。

您的typealias问题必定是Swift的错误。 typealias应隐式公开,就像func fmap(_)是公开的一样。

Access Control

  

协议定义中每个要求的访问级别自动设置为与协议相同的访问级别。您不能将协议要求设置为与其支持的协议不同的访问级别。这可确保在采用该协议的任何类型上都可以看到所有协议的要求。

     
    注意          

如果您定义了公共协议,协议的要求在实施时需要公共访问级别来满足这些要求。此行为与其他类型不同,其中公共类型定义意味着类型成员的内部访问级别。