2016-03-22 26 views
5

bu sadece ayarlayıcı özelÖzel ayarlayıcı "seti()" Swift

docs yılında
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

Merkeze ulaşmak mümkün mü yoksa doğrudan ayarlanamıyor musunuz? Bu mu? –

+0

evet, haklısınız –

+1

Tamam, cevabımı, istediklerinize uygun olacağını düşünerek iptal ettim. Özel (set) 'i kullanmanın diğer cevabı da işe yarayabilir, ancak belirtildiği gibi, aksi takdirde düşündüğünüzden farklı çalışır. Merkez özelliğini ayarlayamamak istediğiniz için en iyi yol, merkezi için hesaplanmış özellikleri kullanmaktır. Umarım bu yardımcı olur –

cevap

1

Yapı Rectini aşağıdaki gibi hassaslaştırabilirsiniz. Bu sadece merkezi almanıza izin vermez, ancak ayarlamaz.

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

başlığı altında ilk kod örneğinde "nasıl yapabilir apple tarafından sağlanan örnek tanıtıldı pint yapısı ayarlayıcı getter işaret olduğunu alıcılar ve Setters" bunu özel ayarlayıcı olması görebilirsiniz, sözdizimi şu şekildedir:

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

Bazı açıklama: Swift içinde private biraz daha farklı çalışır - bu doğru erişimi sınırlar Bir dosyanın kapsamına ty/yöntem. Bir dosyada birden fazla sınıf olduğu sürece, tüm içeriğine erişebilirler. private "Çalışmak" için, sınıfınızı ayrı dosyalarda bulundurmanız gerekir.

+0

Bu, gerçek bir projede değil, Oyun alanında hiçbir uyarı üretmez. 'Point'i' center' özelliği olarak ayarlayabilirim. –

+5

'Private', Swift'de biraz" farklı "çalışır - özellik/yöntem kullanımını * dosyasının * kapsamı ile sınırlar. Yani oyun alanında gerçek bir özel mülk elde edemezsiniz (en azından nasıl olduğunu bilmiyorum). Gerçek projelerde, sınıflarınızı ayrı dosyalarda tutmalısınız - tek bir dosyada iki sınıfa sahip oldukları sürece tüm özelliklerine/yöntemlerine erişebilirler. – Losiowaty

+1

Teşekkürler, tam da düşündüğüm şey buydu. –