2016-03-03 11 views
7

私のチームは、新しいファイルを迅速に作成し、Objective-CオブジェクトでKVCを使用してSwiftオブジェクトのプロパティを設定する際に奇妙な問題が発生すると判断しました。Objective-CオブジェクトのKVCをSwiftプロパティに使用できないのはなぜですか?

私のObjective-Cはそうのようにプロパティを設定します:[textObject setValue:0.0 forKey:@"fontSize"]

マイスウィフトオブジェクト(textObject)は、このプロパティのカスタムセッター/ゲッターがあります。

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

ただし、setにブレークポイントを設定すると、決してヒットしません。

Objective-Cオブジェクトにも同じ呼び出しがあり、 -setFontSizeを実装するだけで、正しく実行されます。

私のsetメソッドには、-setValueForKeyで表示されないのはなぜですか? 私は100%確認したtextObjectが存在し、正しいタイプです。

EDIT
マーティン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

理由は、スウィフトオプション (とあなたが生成して、そのプロパティ は表示されませんのObjective-Cで表現できない(CGFloat?は、あなたの場合)構造体または列挙型"Project-Swift.h"ヘッダーファイル)。それはあなたが非オプションCGFloat にプロパティの種類を変更した場合は期待どおり@objcで明示的にプロパティ をマークする場合は、エラーメッセージ

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

を得るでしょう、その後KVC作品 より明白になります。また、オプションの クラスタイプ(NSNumber?など)でも動作します。

+1

* "Objective-CではSwiftオプションは表現できません" * - これはオプションのクラス/プロトコルタイプでは当てはまりませんが、CGFloatが1であるstructs/enumsに当てはまります。 – jtbandes

+0

@jtbandes:あなたは正しいです、固定です - ありがとう! –

関連する問題