2017-06-09 105 views
1

我試圖將此Swift代碼轉換爲Kotlin Android並出現問題。如何將此代碼從iOS Swift轉換爲Android Kotlin

Swift code: 

public let kCORNER_RADIUS_BUTTON: CGFloat = 4.0 

我已經轉換了CGFloat的java類,我發現下面

/** 
* 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 
    } 

} 

在科特林代碼我這樣做

public val kCORNER_RADIUS_BUTTON: CGFloat = 4.0 

,但得到錯誤消息「浮點文字不符合預期的類型CGFloat「

+2

爲什麼不直接使用'Double'?另外,您不能將文字分配給這種類型。你必須做'CGFloat(4.0d)'。 – Todd

+0

我不行。我必須嚴格遵循Swift代碼。 試圖 公共VAL kCORNER_RADIUS_BUTTON:CGFloat的(4.0D) 現在越來越「屬性的getter和setter預期」的錯誤 – Smiley

+1

這似乎是一個相當嚴格的,沒有必要要求操作系統之間移植的時候。你的'CGFloat'類只是模仿'Double',所以爲什麼不輸入別名呢? 'typealias CGFloat = Double'。然後你可以將它稱爲'CGFloat'(如果你必須的話)並直接使用'Double'而不必維護一個無用的包裝器。 – Todd

回答

2

如果您必須使用CGFloat,因爲您h大寫它,你必須直接構建一個。你不能只給它分配一個原始類型,Kotlin沒有任何理解這一點的工具。

val kCORNER_RADIUS_BUTTON: CGFloat = CGFloat(4.0) 

但是,因爲你的CGFloat類並沒有做任何事情,Double尚不做,我會建議使用來代替。看起來你有要求(我會推回去)正確地移植它,忽略你正在移植到的語言的慣例。在這種情況下,我只需將Doubleal輸入到CGFloat即可。

typelias CGFloat = Double 

然後你可以使用任何你想要的:

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

使用typealias是你的問題的「正確的」解決方案。如果你正在移植東西並使用基元作爲定義的對象,而這些對象並不特別,那麼這就是你的解決方案。但是,如果您需要具備其他功能,請按照自己的方式擴展數字,並覆蓋運算符函數以支持與基元的交互。 – Ryba

相關問題