【问题标题】:How to resolve a variable in Kotlin, based on IOS solution?如何基于IOS解决方案在Kotlin中解析变量?
【发布时间】:2018-07-19 22:53:11
【问题描述】:

一直在尝试在 Android (Kotlin) 中复制 iOS (Swift) 解决方案。这相当简单,但我不确定我是否走在正确的轨道上,或者我是否需要完全更改我的 Kotlin 代码。 (注意这个解决方案在 Swift 中运行)

这是 Swift 中发生的事情:

enum CarID: String, Codable {

case carHeader
case carView
case dataView

var viewControllerType: UIViewController.Type {
    switch self {
    case .carView: return CarViewController.self
    case .carHeader: return CarHeaderViewController.self
    case .dataView: return DataViewController.self
    }
}

}

现在我尝试在 Kotlin 中匹配它:

enum class ModuleID(val type: String) {

CAR_HEADER("carHeader"),
CAR_VIEW("carView"),
DATA_VIEW("dataView");

val activityType: AppCompatActivity  // Wrong return type?
    get() = when(this) {
        CAR_HEADER -> **CarHeader**  // Error here 
        CAR_VIEW -> CarView
        DATA_VIEW -> DataView
    } 

}

注意我只是想使用 ActivityViewTypes,就像 iOS 使用 viewControllerType。行为应该接近准确。

我看到的错误是:“分类器 'CarHeader' 没有伴随对象,因此必须在此处初始化。”

我试图创建所说的伴随对象,但似乎没有必要,所以我放弃了。欢迎任何建议!我也考虑过研究密封类,但也不确定这里是否有必要。

我也没有提到“可编码”——如果有人想深入研究,那也很好。

谢谢!

【问题讨论】:

    标签: android ios swift variables kotlin


    【解决方案1】:

    你想要的是一个Type,而不是一个实例,所以你可能想要返回一个类,所以用 Java 术语来说:

    UIViewController.Type ==> `Class<? extends Activity>`
    

    考虑到这一点,以下应该可以工作:

    val activityType: Class<out Activity>
        get() = when(this) {
            CAR_HEADER -> CarHeader::class.java
            CAR_VIEW -> CarView::class.java
            DATA_VIEW -> DataView::class.java
        } 
    }
    

    你甚至可以像这样使用

    startActivity(Intent(this, module.activityType))
    

    【讨论】:

    • 太棒了!这效果很好 - 这是您在评论中建议的“外出活动”。很好的收获,它会难倒我的。我很感激! (对你投了赞成票,但它还没有显示,因为我在这里发布的内容不多)
    • 如果它有效,那么您需要勾选左侧的复选标记以表明这是已接受的答案,因为它是问题的解决方案(某些东西),我已经编辑了答案说“出去”谢谢:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多