Kotlin

时间:2017-06-06 05:10:57

标签: android kotlin

我定义为kotlin中的实例变量,并希望初始化onCreate的{​​{1}}方法。

activity

这里我在count变量上遇到以下错误。

  

必须在Kotlin中初始化或抽象属性

好吧,我读了这个帖子Property must be initialized or be abstract并尝试了同样但又一次我收到了以下错误。

  

原始类型属性

上不允许使用lateinit修饰符
var count: Int
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    count.inc()
}

有没有办法在lateinit var count: Int override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) count.inc() } 中执行此操作?

2 个答案:

答案 0 :(得分:41)

有几种方法可以解决此问题。

您可以使用默认值(e.i 0-1或其他)初始化它,然后在逻辑说明时初始化它。

或告诉编译器,使用Delegates.notNull检查notNull将在此代码中稍后初始化计数。

var count: Int by Delegates.notNull<Int>()

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    // You can not call `Int.inc()` in onCreate()` function until `count` is initialised.
    // count.inc()
    // **initialise count** 
}

如果您需要按需计数值(如果不需要在onCreate中初始化),则可以使用lazy函数。仅当您要进行密集(某些计算/充气布局等)任务时才使用此项on demand,而不是仅指定值。

var count:Int by lazy {
    // initialise
}

现在您可以决定使用什么。

我希望它有所帮助。

答案 1 :(得分:-10)

没有理由让它未经初始化。只需将其初始化为0或-1。

lateinit用于非null对象引用,无法在类体定义中轻松初始化。