web-dev-qa-db-ja.com

Swiftは暗黙的な変換をサポートしていますか?

たとえば、次のコードがあります。

    let numberOfBlocks = 3
    let blockWidth = SKSpriteNode(imageNamed: "image.png").size.width
    let padding = 20.0

    let offsetX : Float = (self.frame.size.width - (blockWidth * numberOfBlocks + padding * (numberOfBlocks-1))) / 2

エラーが発生しました:

「Double」は「UInt8」に変換できません

暗黙的にデータ型を変換する方法はありますか(おそらくプリミティブデータ型のみ)。

編集:

Iducool が示唆するように、特定のタイプのコンストラクターを使用して明示的な変換を行う方法を知っています。しかし、変換を追加する場所さえわからないので、それは私の質問の大きな助けにはなりません。遊び場での表現を簡素化しました。

enter image description here

問題は「パディング」変数にあり、エラーメッセージは

「Double」は「UInt8」に変換できません。

だから私は変換を行いました:

enter image description here

次に、問題は「blockWidth」変数にあります。

私は再び変換を追加しました:

enter image description here

エラーメッセージは次のとおりです。

タイプ「UInt8」はプロトコル「FloatLiteralCovertible」に準拠していません

最終的な作業式は次のとおりです。

enter image description here

簡単で迅速ですか?そうは思いません。

29
Bagusflyer

Swiftには暗黙的にキャストはありません。

Swiftでの変換の簡単な方法は、特定のタイプのコンストラクターを使用することです。

DoubleからFloatを取得する場合はFloat(doubleValue)を使用できます。floatを整数に変換する場合は同じ方法でInt(floatValue)を使用できます。

あなたの場合:

let intValue = UInt8(doubleValue)

小数点以下の値は失われることに注意してください。したがって、より良い方法を選択してください。上記の変換は、単に理解を助けるためのものです。

Swiftは、浮動小数点数のタイプを推測するときに、常に(Floatではなく)Doubleを選択します。

34
Iducool

SwiftはXcode6 GMで暗黙的なキャストをサポートしなくなりました。次の回答はXcode6ベータ版にのみ適用されます。


暗黙的にキャストが良いか悪いかについては話したくありませんが、__conversion()が本当に必要な場合はキャストできます。

例えば必要な場合UInt8IntDoubleから変換できます

extension Double {
    func __conversion() -> UInt8 { return UInt8(self) }
    func __conversion() -> Int { return Int(self) }
    // add more if you need to
}

xcrun Swift
Welcome to Swift!  Type :help for assistance.
  1> extension Double {
  2.     func __conversion() -> UInt8 { return UInt8(self) }
  3. }
  4> var d = 1.0
d: Double = 1
  5> var u8 : UInt8 = d
u8: UInt8 = 1
  6>

注:これを実動コードに入れません。可能な場合にのみ指摘したいのですが、推奨しません。

24
Bryan Chen

bridgeToObjectiveC()メソッドを使用すると、Objective-Cで提供されるメソッドを呼び出して、1つのプリミティブデータ型から別のプリミティブデータ型に変換できます。

variable_name.bridgeToObjectiveC().intValue

variable_nameという名前の変数を整数に変換します

1
Raj