objective c lazy Rapida proprietà di sola lettura esterna, readwrite



swift protocol properties (2)

In Swift, qual è il modo convenzionale per definire il modello comune in cui una proprietà deve essere esternamente in sola lettura, ma modificabile internamente dalla classe (e sottoclassi) che la possiede.

In Objective-C, ci sono le seguenti opzioni:

  • Dichiarare la proprietà come readonly nell'interfaccia e utilizzare un'estensione di classe per accedere internamente alla proprietà. Questo è l'accesso basato sui messaggi, quindi funziona bene con KVO, atomicità, ecc.
  • Dichiarare la proprietà come readonly nell'interfaccia, ma accedere internamente al supporto di ivar. Poiché l'accesso predefinito per un ivar è protetto, questo funziona bene in una gerarchia di classi, in cui le sottoclassi saranno anche in grado di modificare il valore, ma il campo è altrimenti in sola lettura.

In Java la convenzione è:

  • Dichiarare un campo protetto e implementare un metodo getter (metodo) pubblico di sola lettura.

Qual è l'idioma per Swift?


Answer #1

Data una proprietà di classe, è possibile specificare un diverso livello di accesso anteponendo la dichiarazione di proprietà con il modificatore di accesso seguito da get o set tra parentesi. Ad esempio, una proprietà di classe con un getter pubblico e un setter privato sarà dichiarata come:

private(set) public var readonlyProperty: Int

Lettura suggerita: Getter e Setter

Le considerazioni di Martin sul livello di accessibilità sono ancora valide, ovvero non esiste un modificatore protected , l' internal limita l'accesso solo al modulo, private solo al file corrente e public senza restrizioni.

Swift 3 note

2 nuovi modificatori di accesso, file fileprivate e open sono stati aggiunti alla lingua, mentre private e public sono stati leggermente modificati:

  • open applica solo ai membri della classe e della classe: è usato per consentire a una classe di essere sottoclassata o un membro per essere sovrascritto al di fuori del modulo in cui sono definiti. public rende invece la classe o il membro accessibili al pubblico, ma non ereditabili o sovrascrivibili

  • private ora rende un membro visibile e accessibile solo dalla dichiarazione allegata, laddove fileprivate all'intero file in cui è contenuto

Maggiori dettagli here .


Answer #2

Come per @Antonio, possiamo usare una singola proprietà per accedere come valore di proprietà readOnly pubblicamente e readWrite privatamente. Di seguito è la mia illustrazione:

class MyClass {

    private(set) public var publicReadOnly: Int = 10

    //as below, we can modify the value within same class which is private access
    func increment() {
        publicReadOnly += 1
    }

    func decrement() {
        publicReadOnly -= 1
    }
}

let object = MyClass()
print("Initial  valule: \(object.publicReadOnly)")

//For below line we get the compile error saying : "Left side of mutating operator isn't mutable: 'publicReadOnly' setter is inaccessible"
//object.publicReadOnly += 1

object.increment()
print("After increment method call: \(object.publicReadOnly)")

object.decrement()
print("After decrement method call: \(object.publicReadOnly)")

Ed ecco l'output:

  Initial  valule: 10
  After increment method call: 11
  After decrement method call: 10




swift