2015-09-27 96 views
2

我实现基本FunctorTypealias都必须公开声明,因为它符合公共协议的要求

// 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必须被公开,因为它符合 的要求公共协议

该消息确实没有给出太多线索,为什么需要公开?

回答

2

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

您的typealias问题一定是Swift的一个bug。 typealias应该隐含公开,就像func fmap(_)是公开的。

Access Control

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

注意

如果你定义一个公共的协议,该协议的要求,需要对这些需求的公共接入水平,他们实现的时候。这种行为不同于其他类型,其中公共类型定义意味着类型成员的内部访问级别。