2017-06-09 46 views
1

このSwiftコードをKotlin Androidに変換しようとしていますが、問題があります。私が行うこのこのコードをiOS swiftからAndroid Kotlinに変換する方法

public val kCORNER_RADIUS_BUTTON: CGFloat = 4.0 

が、取得エラーメッセージ「浮動小数点リテラルにはない

Swift code: 

public let kCORNER_RADIUS_BUTTON: CGFloat = 4.0 

は、私は私がKotlinコードで

/** 
* CGFloat 

* @author [Harald Kuhr](mailto:[email protected]) 
* * 
* @author duncan 
*/ 
class CGFloat : Number { 

    private val value: Double 

    constructor() { 
     value = 0.0 
    } 

    constructor(d: Double) { 
     value = d 
    } 

    override fun toByte(): Byte { 
     return value.toByte() 
    } 

    override fun toChar(): Char { 
     return value.toChar() 
    } 

    override fun toDouble(): Double { 
     return value 
    } 

    override fun toFloat(): Float { 
     return value.toFloat() 
    } 

    override fun toInt(): Int { 
     return value.toInt() 
    } 

    override fun toLong(): Long { 
     return value.toLong() 
    } 

    override fun toShort(): Short { 
     return value.toShort() 
    } 

    override fun hashCode(): Int { 
     // From Double.hashCode 
     val bits = java.lang.Double.doubleToLongBits(value) 
     return (bits xor bits.ushr(32)).toInt() 
    } 

    override fun equals(other: Any?): Boolean { 
     // Modified Double.equals 
     return other is CGFloat && java.lang.Double.doubleToLongBits(other.value) == java.lang.Double.doubleToLongBits(value) 
    } 

    override fun toString(): String { 
     return value.toString() 
    } 

    companion object { 
     // Inspired by JNA NativeLong and IntegerType 
     val SIZE = Integer.MAX_VALUE 
    } 

} 

下回ったCGFloatのJavaクラスを変換しています期待されるタイプに合致するCGFloat "

+2

はなぜちょうど 'Double'を使わないのでしょうか?また、そのような型にリテラルを割り当てることはできません。あなたは 'CGFloat(4.0d)'をしなければなりません。 – Todd

+0

できません。私はスウィフトコードを正確に従わなければならない。 今取得のOS間で移植するときにかなり制限し、不要な要件であると思われるエラー – Smiley

+1

の「プロパティのゲッターとセッターが期待される」CGFloat(4.0D): は 公共ヴァルkCORNER_RADIUS_BUTTONを試してみました。あなたの 'CGFloat'クラスは単に' Double'を模倣しているので、なぜそれをエイリアスとタイプしないのですか? 'typealias CGFloat = Double'です。次に、 'CGFloat'(必要な場合)として参照し、無駄なラッパーを維持することなく直接' Double'を使用することができます。 – Todd

答えて

2

CGFloatをhそれを書いただけで、あなたは直接それを構築しなければならないでしょう。プリミティブ型を割り当てることはできませんが、Kotlinにはそれを理解する機能はありません。あなたのCGFloatクラスがDoubleがまだないん何もしていないため、

val kCORNER_RADIUS_BUTTON: CGFloat = CGFloat(4.0) 

しかし、私の代わりにすることを使用することをお勧めします。あなたが移植している言語の規則を無視して、これを正確に移植するための要件が​​あるように思われます。その場合は、DoubleからCGFloatへの入力だけを行います。

typelias CGFloat = Double 

その後、あなたはどこでもあなたが望むそれを使用することができます。

fun doSomething(foo: CGFloat): CGFloat { ... } 
+0

タイプアリアスの使用はあなたの問題に対する "正しい"解決策です。物事を移植し、プリミティブを定義されたオブジェクトとして使用している場合、それはあなたの解決です。しかし、追加の機能が必要な場合は、Numberを拡張し、プリミティブとのやりとりをサポートするように演算子関数をオーバーライドします。 – Ryba

関連する問題