Псевдоним типа должен быть объявлен общедоступным, поскольку он соответствует требованию общедоступного протокола.

Я реализую базовый 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, появится всплывающая ошибка

Псевдоним типа должен быть объявлен общедоступным, поскольку он соответствует требованию общедоступного протокола.

Это сообщение не дает большой подсказки, зачем оно должно быть публичным?


person onmyway133    schedule 27.09.2015    source источник


Ответы (1)


Все участники протокола должны иметь такой же доступ, как и этот протокол. Из-за этого требования всем членам неявно назначается один и тот же уровень доступа.

Ваша typealias проблема должна быть ошибкой Swift. typealias должно быть неявно общедоступным, точно так же, как func fmap(_) является общедоступным.

Управление доступом

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

NOTE

Если вы определяете общедоступный протокол, требования протокола требуют общедоступного уровня доступа для этих требований при их реализации. Это поведение отличается от других типов, где определение общедоступного типа подразумевает внутренний уровень доступа для членов типа.

person Jeffery Thomas    schedule 27.09.2015