2016-03-03 16 views
7

Ekibim yeni dosyaların hızlı bir şekilde yazılmasına karar verdi ve bir Objective-C nesnesinde bir Swift nesnesinde bir özellik belirlemek için KVC kullanımıyla ilgili garip bir sorun görüyorum.KVC'yi bir Objective-C nesnesinden bir Swift Özelliğine neden kullanamıyorum?

Benim Objective-C şöyle bir özellik ayarlar: [textObject setValue:0.0 forKey:@"fontSize"]

Benim Swift nesne (textObject) bu özellik için özel bir ayarlayıcı/getter vardır. Ben set bir kesme noktası ayarlarsanız

var fontSize: CGFloat? { 
     get { 
     return internalTextGraphic?.fontSize 
     } 
     set { 
      internalTextGraphic?.fontSize = newValue 
     } 
    } 

Ancak, darbe aldığında asla.

Ben de bu aynı çağrıyı almak Objective-C nesneleri var ve ben sadece -setFontSize uygulamak ve yürütme düzgün girer.

-setValueForKey aracılığıyla set yöntemine neden giremiyorum? textObject var% 100 onaylı ve doğru tür.

DÜZENLEME:
Martin R ı tip isteğe bağlı olmayan bir yapmak zorunda doğrudur. Bu benim çalışma kodudur:

var fontSize: CGFloat { 
     get { 
     var retFontSize: CGFloat = 0.0 
     if let fontSize = internalTextGraphic?.fontSize { 
      retFontSize = fontSize 
     } 
     return retFontSize 
     } 
     set { 
     if let textGraphic = internalTextGraphic { 
      textGraphic.fontSize = newValue 
     } 
     } 
    } 

cevap

8

nedeni olduğuna dair Swift isteğe (ve oluşturulan bu özellik görmezsiniz Objective-C sunulabilen değil (CGFloat? senin durumunda) yapı veya numaralandırma "Project-Swift.h" başlık dosyası). Eğer @objc ile açıkça özelliği işaretlerseniz Yani o KVC beklenen işleri olarak isteğe bağlı olmayan CGFloat mülk türünü değiştirmek, o zaman hata mesaj

 
error: property cannot be marked @objc because its type cannot be represented in Objective-C 

alırsınız, daha belirgin hale gelir. Ayrıca NSNumber? gibi isteğe bağlı sınıf türüyle de çalışır.

+1

* "Hızlı isteğe bağlı, Objective-C'de gösterilemez" * - iyi, bu isteğe bağlı sınıflar/protokol türleri için geçerli değildir, ancak CGFloat'ın bir olduğu yapılar/enumlar için geçerlidir. – jtbandes

+0

@jtbandes: Haklısın, sabit - teşekkürler! –

İlgili konular