####Examples from "Swift 2 to 3" by Erica Sadun
Available from iTunes and LeanPub
// Default is internal
struct MyType {
let member: String = "Member" // default is internal
fileprivate let filemember: String = "FileMember"
private let privatemember: String = "PrivateMember"
internal let internalmember: String = "InternalMember"
public let publicmember: String = "PublicMember"
public init() {}
}
private struct MyPrivateType {
let member: String = "Member" // default is internal
fileprivate let filemember: String = "FileMember"
private let privatemember: String = "PrivateMember"
internal let internalmember: String = "InternalMember"
public let publicmember: String = "PublicMember"
public init() {}
}
fileprivate struct MyFilePrivateType {
let member: String = "Member" // default is internal
fileprivate let filemember: String = "FileMember"
private let privatemember: String = "PrivateMember"
internal let internalmember: String = "InternalMember"
public let publicmember: String = "PublicMember"
public init() {}
}
internal struct MyInternalType {
let member: String = "Member" // default is internal
fileprivate let filemember: String = "FileMember"
private let privatemember: String = "PrivateMember"
internal let internalmember: String = "InternalMember"
public let publicmember: String = "PublicMember"
public init() {}
}
public struct MyPublicType {
let member: String = "Member" // default is internal
fileprivate let filemember: String = "FileMember"
private let privatemember: String = "PrivateMember"
internal let internalmember: String = "InternalMember"
public let publicmember: String = "PublicMember"
public init() {}
}
Type | Scope | Visibility | Outside of Type | In Type Extension |
All five types | Same file | Can create instances | `privatemember`: inaccessible due to 'private' protection level | `privatemember` is unresolved identifier |
MyType, MyInternalType, and MyPublicType | Same module, different file | Can create instances | `privatemember` and `filemember`: inaccessible due to 'private' protection level | `privatemember` and `privatemember` are unresolved identifiers |
MyFilePrivateType and MyFilePrivateType | Same module, different file | Undeclared types | N/A | N/A |
MyPublicType | External to module | Can create instances | Can access `publicmember` but no other members | `publicmember` is visible |
MyFilePrivateType, MyPrivateType, MyType, MyInternalType | External to module | Undeclared types | N/A | N/A |
public class PublicClass {
public let propertyPublic = "PublicMember"
public func actionPublic() {}
open let propertyOpen = "PublicMember"
open func actionOpen() {}
}
open class OpenClass {
public let propertyPublic = "PublicMember"
public func actionPublic() {}
open let propertyOpen = "PublicMember"
open func actionOpen() {}
}
Type | Scope | Actions |
OpenClass and Public Class | Same Module, Any File | Can subclass and override methods |
OpenClass | External to Module | Can subclass and override open methods. Cannot override non-open methods outside defining module |
Public Class | External to Module | Cannot subclass or override from non-open class outside defining module |