2016-03-22 16 views
5

Questo è il punto esempio introdotto pinta struttura setter getter fornito da apple come può fare solo setter privatoprivato setter "set()" in Swift

struct Point { 
    var x = 0.0, y = 0.0 
} 
struct Size { 
    var width = 0.0, height = 0.0 
} 
struct Rect { 
    var origin = Point() 
    var size = Size() 
    var center: Point { 
     get { 
      let centerX = origin.x + (size.width/2) 
      let centerY = origin.y + (size.height/2) 
      return Point(x: centerX, y: centerY) 
     } 
     set(newCenter) { 
      origin.x = newCenter.x - (size.width/2) 
      origin.y = newCenter.y - (size.height/2) 
     } 
    } 
} 
+2

vuoi essere in grado di ottenere il centro ma non impostarlo direttamente? È così? –

+0

sì, hai ragione. –

+1

Ok, ho annullato la mia risposta pensando che potrebbe essere adatto a quello che vuoi. L'altra risposta all'uso di 'private (set)' può anche funzionare ma, come indicato, funziona in modo diverso rispetto a quello che altrimenti pensereste. Dal momento che non vuoi essere in grado di impostare la proprietà del centro, il modo migliore è usare le proprietà calcolate per il centro. Spero che questo aiuti –

risposta

1

È possibile rifinire la struttura Rect come segue. Questo ti consentirà di ottenere solo il centro ma non di impostarlo.

struct Rect { 

    var center:Point { 
     let centerX = origin.x + (size.width/2) 
     let centerY = origin.y + (size.height/2) 
     return Point(x: centerX, y: centerY) 
    } 

    var origin = Point() 
    var size = Size() 
} 
12

Nel docs, nel primo esempio di codice sotto il titolo " getter e setter" si può vedere che per avere un setter privata, la sintassi è simile al seguente:

private (set) var center: Point {... 

Alcuni chiarimenti: private in Swift funziona un po 'diverso - limita l'accesso al corretto ty/method allo scopo di un file. Finché c'è più di una classe in un file, saranno in grado di accedere a tutti i loro contenuti. Per fare in modo che private "funzioni", devi avere le tue classi in file separati.

+0

Questo non produce alcun avviso né in Playground, non nel progetto reale. Posso impostare la proprietà 'Punto' su' centro'. –

+5

'Private' funziona un po '" diverso "in Swift - limita l'uso della proprietà/metodo all'ambito del * file *. Quindi in Playground non è possibile ottenere una vera proprietà privata (almeno non so come). Nei progetti reali dovresti mantenere le tue classi in file separati - finché hai due classi in un unico file possono accedere a tutte le loro proprietà/metodi. – Losiowaty

+1

Grazie, è esattamente quello che stavo pensando. –