2

学術的な目的のために、私は次のような表現を好むとしましょう

someInt.asDouble

ストックというより

Double(someInt)

さまざまな Swift 整数型のすべてがIntegerTypeプロトコルに準拠していて、これらの int 型のすべての種類に適合する初期化子があるように思われるため、Double()次のようなことができると思いました。

extension IntegerType {
    var asDouble:Double {
        return Double(self)
    }
}

これは動作しません。そして、私はその理由を知りたいですか?それを機能させる魔法があるかどうか知りたいですか?たぶんwhere?それともselfリファレンスと関係がありますか?

これで試したプレイグラウンドのコンソールに表示されるエラーは次のとおりです。

Playground execution failed: /var/folders/2k/6y8rslzn1m95gjpg534j7v8jzr03tz/T/./lldb/41416/playground37.swift:31:10: error: cannot invoke initializer for type 'Double' with an argument list of type '(Self)'
                return Double(self)
                       ^
/var/folders/2k/6y8rslzn1m95gjpg534j7v8jzr03tz/T/./lldb/41416/playground37.swift:31:10: note: overloads for 'Double' exist with these partially matching parameter lists: (Double), (UInt8), (Int8), (UInt16), (Int16), (UInt32), (Int32), (UInt64), (Int64), (UInt), (Int), (Float), (Float80), (String), (CGFloat), (NSNumber)
                return Double(self)
4

1 に答える 1

3

すべてIntegerTypeのタイプは に昇格できIntMaxIntMaxに変換できますDouble

extension IntegerType {
    var asDouble: Double {
        return Double(self.toIntMax())
    }
}

あなたが示唆するように、これは特に有用なことではありません (Double(x)は正しい構文です) が、他の問題には役立つかもしれません。

これを作成する場合は、標準ライブラリのパターンを続行します。パターンは次のものではありtoX()ませんasX

extension IntegerType {
    func toDouble() -> Double {
        return Double(self.toIntMax())
    }
}

toOpaque()およびも参照してくださいtoUIntMax()asはコピーせずに型を単純に再解釈するvarことを提案し、a はそれがこの値のプロパティであることを提案します。それは起こっていることではありません。実際には、異なる形式で保存された別の値に変換しているため、等しくない場合もあります。(大きな整数の場合、 のような丸め誤差が生じる場合がありますx != Int(x.toDouble())。)

IntegerType (および FloatingPointType) を拡張しようとしている も読む価値があります。すべての Int 型を NSTimeInterval に変換できないのはなぜですか。この問題について詳しく説明し、細心の注意を払わないと同様の機能が危険になる理由について説明します。

于 2015-11-11T21:21:35.060 に答える