[swift-evolution] Analysis of existing scopes

Joanna Carter joanna at carterconsulting.org.uk
Wed Feb 22 09:31:29 CST 2017

After much to-ing and fro-ing about scopes on Swift, I, for one, am getting confused about exactly what effects the present scopes have on the various fundamental types used in Swift (protocols, classes, structs, enums, ordinal types)

Therefore, if you will indulge me, I would like to start a thread in which I will I will outline what is and what is not possible at present.

Let me start with protocols :

If I start with the lowest visibility - private

private protocol PrivateProtocol { }

private protocol DoublePrivateProtocol : PrivateProtocol
  var p: PrivateProtocol { get }

It would seem that, within the same file, private has the same meaning as fileprivate. Understandable to some degree but could be confusing to some.

We can both inherit from and use a private protocol as part of another private or fileprivate protocol

internal class Fred
  init() { }
  private var pp: PrivateProtocol

We can also implement or use a private protocol as part of another non-private, non-protocol type

internal protocol InternalProtocol : PrivateProtocol // error : Internal protocol cannot refine a fileprivate protocol
  var p: PrivateProtocol { get } // error : Property cannot be declared internal because its type uses a fileprivate type

However, we cannot either inherit from or use a private protocol as part of a non-private protocol. Totally understandable.

Both internal and public protocol scopes are also self explanatory, and it is obvious that, just as an internal protocol cannot refine or use a private protocol, neither can a public protocol cannot refine or use an internal one.

For this post, my only question is - why is private allowed when, in reality, it is fileprivate for protocols?

More to follow…
Joanna Carter
Carter Consulting

More information about the swift-evolution mailing list