More thinking out loud...
`public` -> exported from module
<omitted> -> module scoped (e.g. current internal)
`private` -> class, struct, etc. scoped (e.g. new private)
`private(file)` or `file` -> file scoped (e.g existing private)
`private(module)` or `module` or `internal` -> module scoped (e.g. current
internal)
public var foo = 0 // marks default getter and setter public
public var foo = 0 { // marks default getter and setter public however...
private set // marks default setter private
}
var foo = 0 { // marks default getter and setter module scoped however...
public get // marks default getter public
private set // marks default setter private
}
public var foo: Int { ... } // marks provided getter public, read-only
var foo: Int { // marks provided getter and setter module scoped
however...
public get { ... } // marks provided getter public
private set { ... } // marks provided setter private
}
public var foo: Int { // marks provided getter and setter public however...
get { ... } // not specified, inherit access level public
private set { ... } // marks provided setter private
}
var foo: Int { // marks provided getter and setter module scoped
however...
get { ... } // not specified, inherit access level module scoped
private set { ... } // marks provided setter private
}
private(module) var foo: Int { // marks provided getter and setter module
scoped however...
get { ... } // not specified, inherit access level module
scoped
private(file) set { ... } // marks provided setter file scoped
}
var foo: Int { // marks provided getter and setter module
scoped however...
private(file) get { ... } // not specified, inherit access level module
scoped
private set { ... } // marks provided setter file scoped
}
...etc...
public subscript(index: Int) -> Int { ... } // marks provided getter
public, read-only
public subscript(index: Int) -> Int { // marks provided getter and setter
public
get { ... } // not specified, inherit access
level public
set { ... } // not specified, inherit access
level public
}
public subscript(index: Int) -> Int { // marks provided getter and setter
public however...
get { ... } // not specified, inherit access
level public
private set { ... } // marks provided setter private
}
subscript(index: Int) -> Int { // marks provided getter and setter module
scoped however...
get { ... } // not specified, inherit access level
module scoped
private set { ... } // marks provided setter private
}
subscript(index: Int) -> Int { // marks provided getter and setter module
scoped however...
public get { ... } // marks provided getter public
private set { ... } // marks provided setter private
}
subscript(index: Int) -> Int { // marks provided getter and setter module
scoped however...
public get { ... } // marks provided getter public
private(file) set { ... } // marks provided setter file scoped
}
...etc...
···
On Mon, Mar 14, 2016 at 5:18 PM Chris Lattner via swift-evolution < swift-evolution@swift.org> wrote:
Per Doug’s email, the core team agrees we should make a change here, but
would like some bikeshedding to happen on the replacement name for private.
To summarize the place we’d like to end up:
- “public” -> symbol visible outside the current module.
- “internal” -> symbol visible within the current module.
- unknown -> symbol visible within the current file.
- “private” -> symbol visible within the current declaration (class,
extension, etc).