【问题标题】:How to convert this code from iOS swift to Android Kotlin如何将此代码从 iOS swift 转换为 Android Kotlin
【发布时间】:2017-06-09 14:33:40
【问题描述】:

我正在尝试将此 Swift 代码转换为 Kotlin Android 并遇到问题。

Swift code:

public let kCORNER_RADIUS_BUTTON: CGFloat = 4.0

我已经转换了我在下面找到的 CGFloat java 类

/**
 * CGFloat

 * @author [Harald Kuhr](mailto:harald.kuhr@gmail.com)
 * *
 * @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
    }

}

在 Kotlin 代码中我这样做

public val kCORNER_RADIUS_BUTTON: CGFloat = 4.0

但收到错误消息“浮点文字不符合预期的 CGFloat 类型”

【问题讨论】:

  • 为什么不直接使用Double?此外,您不能将文字分配给这样的类型。你必须这样做CGFloat(4.0d)
  • 我不能。我必须严格遵守 Swift 代码。尝试了 public val kCORNER_RADIUS_BUTTON: CGFloat(4.0d) now getting "property getter and setter expected" 错误
  • 在操作系统之间移植时,这似乎是一个相当严格和不必要的要求。你的CGFloat 类只是在模仿Double,那么为什么不输入别名呢? typealias CGFloat = Double。然后您可以将其称为CGFloat(如果必须)并直接使用Double,而无需维护无用的包装器。
  • 谢谢。我会尝试类型别名。我不是 Swift 开发人员,所以这对我来说是全新的。最后一个问题:如何设置 typealias 以在 kotlin 项目中全局使用?
  • 你可能想看看这个比较:nilhcem.com/swift-is-like-kotlin

标签: java android ios swift kotlin


【解决方案1】:

如果你必须使用你写的CGFloat,你必须直接构造一个。您不能只为其分配原始类型,Kotlin 无法理解这一点。

 val kCORNER_RADIUS_BUTTON: CGFloat = CGFloat(4.0)

但是,因为您的 CGFloat 类没有做任何 Double 还没有做的事情,我建议您改用它。似乎您有要求(我会推回)来准确地移植它,而忽略了您要移植到的语言的约定。在这种情况下,我只需将 Double 键入别名为 CGFloat。

typelias CGFloat = Double

然后你可以在任何你想要的地方使用它:

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

【讨论】:

  • 使用 typealias 是解决问题的“正确”方法。如果您要移植事物并使用原语作为定义的对象,这些对象并没有什么特别之处,那么这就是您的解决方案。但是,如果您需要其他功能,请像您一样扩展 Number 并覆盖运算符函数以支持与原语的交互。
猜你喜欢
  • 2019-11-19
  • 2018-06-24
  • 1970-01-01
  • 2021-08-22
  • 2014-01-23
  • 2018-08-22
  • 1970-01-01
  • 1970-01-01
  • 2018-04-16
相关资源
最近更新 更多