2016-09-24 9 views
1

NSObjectProtocolの実行セレクタ関数を呼び出して戻り値を取得しようとすると、クラッシュするのはなぜですか?誰でも私を助けることができますか?どうも。Swift 3でNSObjectProtocolクラッシュの実行セレクタ関数を使用

class Convert: NSObject { 

    func value(_ value: CGFloat, from srcUnit: DWUnitType, to dstUnit: DWUnitType) { 
     let selector = Selector("_centimeterToMillimeter:") 
     let newValue = perform(selector, with: value).takeUnretainedValue() as? CGFloat 
     print(newValue) 
    } 

    func _centimeterToMillimeter(_ value: CGFloat) -> CGFloat { 
     return value * 10.0 
    } 
} 
+0

メソッドを直接呼び出すのではなく、 'perform(selector')を呼び出す目的は何ですか?また、メソッドが実際には非オプションのCGFloatを返す間に戻り値がオプションにキャストされるのはなぜですか? – vadian

答えて

0

ないのObjective-CにCGFloatのブリッジングが動作するかどうか確認してください(あなたがクラッシュしている理由は、おそらくこれがあります)。お試しに変換機能(またはその効果)をお試しください。

func _centimeterToMillimeter(_ value: Any) -> Any { 
    return (value as! CGFloat) * 10.0 
} 

一般的なコメントと同様に、ランタイム(例:perform:_:with)を使用すると、コンパイル時のチェックの快適性を放棄し、クラッシュをデバッグするのが難しい世界に足を踏み入れることになります。あなたがやっていることが分かります。

関連する問題