2016-03-03 31 views
7

我的團隊已經決定應該用swift編寫新文件,而且我在使用Objective-C對象中的KVC設置Swift對象的屬性時看到了一個奇怪的問題。爲什麼我不能將Objective-C對象中的KVC用於Swift屬性?

我的目標C設置一個屬性,像這樣:[textObject setValue:0.0 forKey:@"fontSize"]

我夫特對象(textObject)具有用於該屬性的自定義設置器/吸氣劑。

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

但是,如果我在set設置斷點,它永遠不會被擊中。

我有Objective-C對象,也得到這個相同的調用,我只是實現 -setFontSize,並執行正確輸入。

爲什麼我似乎無法通過-setValueForKey進入我的set方法? 我已經100%確認textObject存在並且是正確的類型。

編輯
馬丁R是正確的,我不得不做出的類型爲非可選。這是我的工作代碼:

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 
     } 
     } 
    } 

回答

8

的原因是,斯威夫特可選的結構或枚舉(在你的情況CGFloat?) 不是在Objective-C表示的(你不會看到房地產 中產生"Project-Swift.h"頭文件)。如果你有@objc標記屬性 明確愈加明顯 ,那麼你會得到錯誤信息

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

如果更改屬性類型的非可選CGFloat 然後KVC按預期工作。它也可以使用可選的 類別類型,例如NSNumber?

+1

*「一個Swift可選不能在Objective-C中表示」* - 呃,對於可選類/協議類型來說這不是真的,但對於CGFloat就是其中一個的結構/枚舉也是如此。 – jtbandes

+0

@jtbandes:你說的對,修好了 - 謝謝! –

相關問題