2016-11-11 2 views
1

Swift DecimalとObjective C NSDecimalNumberの間の型変換に問題があります。Swift 3のNSDecimalNumberではなく、Objective Cへの小数点のインポート

私はスウィフトクラスがある場合:

@objc class Exam: NSObject { 
    var grade: Decimal = 90.0 
} 

を客観Cでそのスウィフトクラスを使用しようと、

Exam *exam = [[Exam alloc] init]; 
NSDecimalNumber *result = [[NSDecimalNumber zero] decimalNumberByAdding:grade.value]; 

私はエラーを取得する:それとして

Sending 'NSDecimal' to parameter of incompatible type 'NSDecimalNumber * _Nonnull' 

gradeNSDecimalではなく、NSDecimalNumberとして扱われているようです。それは私が何か間違ったことをやっている)1のであれば、私はよく分からない

The Swift overlay to the Foundation framework provides the Decimal structure, which bridges to the NSDecimalNumber class. The Decimal value type offers the same functionality as the NSDecimalNumber reference type, and the two can be used interchangeably in Swift code that interacts with Objective-C APIs. This behavior is similar to how Swift bridges standard string, numeric, and collection types to their corresponding Foundation classes.

を言うあたり、これは間違っているようです。 2)ドキュメントに誤りがありますか?3)これは迅速なバグです。

その後、私は全体の醜いdecimalNumberByAddingダンスをやってなく、そのような+などの単純な算術演算を行うことができないので、私は明示的に私のスウィフトクラスNSDecimalNumberの値を作成する必要はありません。

+1

私の知る限り、 '、NSDecimalNumber'を見ることができるようにObjective-CとSwiftでは同じで、ObjCのNSDecimalはSwiftのDecimalです。あなたはそれらをSwiftでキャストすることができますが、SwiftはObjCの 'NSDecimalNumber'とSwiftの' Decimal'(他のオーバーレイタイプと同じように)を自動的に橋渡ししません。これは、ドキュメントのバグまたはエラーである可能性があります。 –

+0

似たような混乱がここにあります:http://stackoverflow.com/questions/39890795/decimal-to-double-conversion-in-swift-3。 –

+0

そのドキュメンテーションは私が期待している動作を完全に意味していますか? "Decimal値型はNSDecimalNumber参照型と同じ機能を提供し、2つはObjective-C APIと相互作用するSwiftコードで互換的に使用できます"。おそらくバグ報告に行くでしょう。 – chrismanderson

答えて

1

DecimalNSDecimalNumberのブリッジング機能はStringNSString、またはArrayNSArrayのように動作しないようです。しかし、それはIntNSNumberのようなものです。

SwiftのIntプロパティはObjective-CのNSNumberとしてアクセスできるとは思われません。 Objective-Cのと使用するためにゲッターを追加する方法について

方法:

extension Exam { 
    @objc var gradeValue: NSDecimalNumber { 
     return grade as NSDecimalNumber 
    } 
} 

あなたはObjective-Cでこのようにそれを使用することができます:

Exam *exam = [[Exam alloc] init]; 
NSDecimalNumber *result = [[NSDecimalNumber zero] decimalNumberByAdding:exam.gradeValue]; 
関連する問題