Latest web development tutorials

control de acceso rápido

El control de acceso se puede definir en otros archivos o módulos de código fuente para el nivel de acceso del código.

Puede explícitamente a un solo tipo (clase, estructura de enumeración) para establecer los niveles de acceso, puede también dar a estos tipos de propiedades, funciones, método de inicialización, el tipo básico, los índices subíndice establecen los niveles de acceso.

Acuerdo también puede limitarse a utilizar dentro de un cierto rango, incluido el acuerdo de las constantes globales, variables y funciones.

módulo de control de acceso basado en los archivos de origen.

Los módulos se definen por una unidad separada para construir y publicar marco o aplicaciones. Un módulo puede ser utilizado en el Swift en la palabra clave import introduce otro módulo.

El archivo de origen es un archivo de fuente única, que por lo general pertenece a un módulo que contiene los archivos de origen pueden definir varias clases y funciones.

Swift ofrece tres diferentes niveles de acceso: código de entidad pública, interna, privada.

Nivel de acceso definiciones
público Cualquier entidad que pueda acceder a los archivos en el módulo de origen, otros pueden acceder a los archivos de origen de todas las entidades a través de la introducción del módulo.
interna : Cualquier entidad que pueda acceder a los archivos en el módulo de origen, pero otros no pueden acceder a los archivos del módulo entidades de origen.
privado Utilice única entidad en el archivo de fuente de corriente, conocida como una entidad privada.

el acceso del público al nivel más avanzado, privado es el nivel más bajo de acceso.

gramática

Al declarar modificadores pública, entidades, de nivel de acceso privado interno:

public class SomePublicClass {}
internal class SomeInternalClass {}
private class SomePrivateClass {}

public var somePublicVariable = 0
internal let someInternalConstant = 0
private func somePrivateFunction() {}

A menos que haya instrucciones especiales, de lo contrario entidades utilizan el nivel de acceso por defecto interno.


Tipo de función de acceso

Los niveles de acceso en base a los parámetros de función derivados requiere el tipo de tipo de retorno de la función y el nivel de acceso.

El ejemplo siguiente define una función global llamada algunaFuncion, y no se afirma explícitamente su nivel de acceso.

func someFunction() -> (SomeInternalClass, SomePrivateClass) {
    // 函数实现
}

Función en una de las clases SomeInternalClass nivel de acceso es interno, el otro nivel de acceso SomePrivateClass es privada. Por lo tanto, de acuerdo con el principio de la tupla nivel de acceso, el nivel de acceso tupla es privado.

Debido a que la función devuelve el tipo del nivel de acceso es privado, por lo que debe utilizar el modificador privada declare explícitamente la función:
private func someFunction() -> (SomeInternalClass, SomePrivateClass) {
    // 函数实现
}

Esta función se declara como público o interno, o utilice la opción predeterminada niveles de acceso internos están equivocados.


El acceso tipo enumerado

miembros de la enumeración de nivel de acceso heredados de la enumeración, no se puede enumerar los miembros de una declaración por separado diferentes niveles de acceso.

Ejemplos

Por ejemplo, el siguiente ejemplo, el estudiante enumeración se declara explícitamente como nivel público, entonces sus miembros nombre, nivel de acceso de Mark también es pública:

public enum Student {
    case Name(String)
    case Mark(Int,Int,Int)
}

var studDetails = Student.Name("Swift")
var studMarks = Student.Mark(98,97,95)

switch studMarks {
case .Name(let studName):
    print("学生名: \(studName).")
case .Mark(let Mark1, let Mark2, let Mark3):
    print("学生成绩: \(Mark1),\(Mark2),\(Mark3)")
}

La salida por encima de la ejecución del programa es:

学生成绩: 98,97,95

acceso subclases

subclase nivel de acceso no podrá exceder el nivel de acceso de la clase padre. Por ejemplo, el nivel de acceso de la clase padre es interno, el nivel de acceso de la subclase no puede ser declarado como público.

public class SuperClass {
    private func show() {
        print("超类")
    }
}

// 访问级别不能低于超类 internal > public
internal class SubClass: SuperClass  {
    override internal func show() {
        print("子类")
    }
}

let sup = SuperClass()
sup.show()

let sub = SubClass()
sub.show()

La salida por encima de la ejecución del programa es:

超类
子类

Constantes, variables, propiedades, el acceso de índice

Constantes, variables, atributos no pueden tener más de su tipo de niveles de acceso.

Por ejemplo, se define un nivel de propiedad pública, pero es el tipo de nivel privado, que no está permitido por el compilador.

Del mismo modo, el índice no puede tener un rendimiento más alto que el tipo de índice o tipos de niveles de acceso.

Si las constantes, variables, propiedades, el tipo de índice subíndice definida es el nivel privado, deben ser claramente el nivel de acceso a la privada:

private var privateInstance = SomePrivateClass()

Getter y el acceso del organismo

Getters y setters constantes de nivel de acceso, variables, propiedades, subíndice heredan del nivel de acceso que pertenecen a los miembros.

Setter niveles de acceso pueden ser menores que el nivel de acceso correspondiente Getter, para que pueda controlar las variables, propiedades o subíndice de leer y escribir.

class Samplepgm {
    private var counter: Int = 0{
        willSet(newTotal){
            print("计数器: \(newTotal)")
        }
        didSet{
            if counter > oldValue {
                print("新增加数量 \(counter - oldValue)")
            }
        }
    }
}

let NewCounter = Samplepgm()
NewCounter.counter = 100
NewCounter.counter = 800

La salida por encima de la ejecución del programa es:

计数器: 100
新增加数量 100
计数器: 800
新增加数量 700

Constructor y constructor por defecto el acceso

inicialización

Podemos personalizar el método de inicialización de declarar el nivel de acceso, sino que pertenece a la clase o de lo contrario un mayor nivel de acceso. Pero excepción necesaria constructor, debe acceder nivel y el acceso al mismo nivel de su clase.

Como una función o método parámetros, el método de parámetros de inicialización de nivel de acceso no puede ser menor que el método de inicialización nivel de acceso.

El método de inicialización por defecto

Swift es una estructura, la clase proporciona un método de inicialización por defecto sin parámetros, para la totalidad de su propiedad para proporcionar la asignación, pero no da un valor específico.

El método de inicialización por defecto pertenece al mismo nivel de acceso y el tipo de nivel de acceso.

Ejemplos

Utilice la sentencia palabra clave requerida antes de método de acceso init () en cada subclase.

class classA {
    required init() {
        var a = 10
        print(a)
    }
}

class classB: classA {
    required init() {
        var b = 30
        print(b)
    }
}

let res = classA()
let show = classB()

La salida por encima de la ejecución del programa es:

10
30
10

Acuerdo de acceso

Si quieres un acuerdo claro afirma el nivel de acceso, es necesario tener en cuenta que usted quiere asegurarse de que el acuerdo sólo se utiliza en la función de nivel de acceso que se indique de dominio.

Si se define un protocolo de nivel de acceso público, para lograr la función necesaria para el Acuerdo que será proporcionado por el nivel de acceso público. Esto es diferente de otros tipos, tales como otros tipos de nivel de acceso público, el nivel de acceso para los miembros de su interior.

public protocol TcpProtocol {
    init(no1: Int)
}

public class MainClass {
    var no1: Int // local storage
    init(no1: Int) {
        self.no1 = no1 // initialization
    }
}

class SubClass: MainClass, TcpProtocol {
    var no2: Int
    init(no1: Int, no2 : Int) {
        self.no2 = no2
        super.init(no1:no1)
    }
    
    // Requires only one parameter for convenient method
    required override convenience init(no1: Int)  {
        self.init(no1:no1, no2:0)
    }
}

let res = MainClass(no1: 20)
let show = SubClass(no1: 30, no2: 50)

print("res is: \(res.no1)")
print("res is: \(show.no1)")
print("res is: \(show.no2)")

La salida por encima de la ejecución del programa es:

res is: 20
res is: 30
res is: 50

acceso ampliado

Puede permitir que bajo las condiciones de la clase, la estructura, la expansión de la enumeración. los miembros extendidos de los miembros de la clase originales deben tener el mismo nivel de acceso. Por ejemplo, ampliar un tipo común, a continuación, añadir los nuevos miembros deben tener los mismos miembros del nivel de acceso interno por defecto original.

Alternativamente, se puede declarar explícitamente el nivel extendido de acceso (por ejemplo, el uso de la extensión privada) dentro de la extensión a todos los miembros afirman un nuevo nivel de acceso predeterminado. El nuevo nivel de acceso predeterminado aún se puede afirmar miembro individual cubierto por el nivel de acceso.


acceso genérico

tipo genérico nivel de acceso o funciones genéricas para tomar el tipo genérico, la función en sí, el parámetro de tipo genérico de los tres niveles más bajos de acceso.

public struct TOS<T> {
    var items = [T]()
    private mutating func push(item: T) {
        items.append(item)
    }
    
    mutating func pop() -> T {
        return items.removeLast()
    }
}

var tos = TOS<String>()
tos.push("Swift")
print(tos.items)

tos.push("泛型")
print(tos.items)

tos.push("类型参数")
print(tos.items)

tos.push("类型参数名")
print(tos.items)
let deletetos = tos.pop()

La salida por encima de la ejecución del programa es:

["Swift"]
["Swift", "泛型"]
["Swift", "泛型", "类型参数"]
["Swift", "泛型", "类型参数", "类型参数名"]

typeAlias

Todo lo que escriba alias se define como un tipo diferente, con el fin de facilitar el control de acceso. El nivel de acceso de un tipo de tipo de alias no puede ser más alto que el nivel original de acceso.

Por ejemplo, un tipo de clase privada alias se pueden asignar a un tipo de público, interno, privado, sino un tipo nivel público alias sólo se pueden establecer a un tipo de nivel público no se puede establecer el tipo de nivel interno o privado .

Nota: Esta regla también se aplica al caso con el fin de cumplir con la conformidad de protocolo para el nombre de modelo y un alias.

public protocol Container {
    typealias ItemType
    mutating func append(item: ItemType)
    var count: Int { get }
    subscript(i: Int) -> ItemType { get }
}

struct Stack<T>: Container {
    // original Stack<T> implementation
    var items = [T]()
    mutating func push(item: T) {
        items.append(item)
    }
    
    mutating func pop() -> T {
        return items.removeLast()
    }
    
    // conformance to the Container protocol
    mutating func append(item: T) {
        self.push(item)
    }
    
    var count: Int {
        return items.count
    }
    
    subscript(i: Int) -> T {
        return items[i]
    }
}

func allItemsMatch<
    C1: Container, C2: Container
    where C1.ItemType == C2.ItemType, C1.ItemType: Equatable>
    (someContainer: C1, anotherContainer: C2) -> Bool {
        // check that both containers contain the same number of items
        if someContainer.count != anotherContainer.count {
            return false
        }
        
        // check each pair of items to see if they are equivalent
        for i in 0..<someContainer.count {
            if someContainer[i] != anotherContainer[i] {
                return false
            }
        }
        
        // all items match, so return true
        return true
}

var tos = Stack<String>()
tos.push("Swift")
print(tos.items)

tos.push("泛型")
print(tos.items)

tos.push("Where 语句")
print(tos.items)

var eos = ["Swift", "泛型", "Where 语句"]
print(eos)

La salida por encima de la ejecución del programa es:

["Swift"]
["Swift", "泛型"]
["Swift", "泛型", "Where 语句"]
["Swift", "泛型", "Where 语句"]