2017-06-06 21 views
3

kotlinにインスタンス変数のように定義していて、onCreateメソッドをactivityに初期化したいとします。lateinit修飾子はKotlinのプリミティブ型プロパティでは使用できません

var count: Int 
override fun onCreate(savedInstanceState: Bundle?) { 
    super.onCreate(savedInstanceState) 
    setContentView(R.layout.activity_main) 
    count.inc() 
} 

ここでは、カウント変数に次のエラーが発生しています。

プロパティが初期化またはまあKotlin

に抽象的でなければなりません、私はこのスレッドProperty must be initialized or be abstractを読み、同じ試みたが、再び、私は以下のエラーを取得しています。

lateinit修飾子は、プリミティブ型のプロパティ

lateinit var count: Int 
override fun onCreate(savedInstanceState: Bundle?) { 
    super.onCreate(savedInstanceState) 
    setContentView(R.layout.activity_main) 
    count.inc() 
} 

上で許可されていませんKotlinでこれを行う方法はありますか?

+2

最初に0に初期化することができます。 –

+0

を参照してください:https://stackoverflow.com/a/44206094/3679676 –

答えて

8

この問題を解決する方法はいくつかあります。

デフォルト値(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 
} 

これで、使用するものを決めることができました。

私はそれが役に立ちそうです。

-3

未初期化のままにする理由はありません。 0または-1に初期化するだけです。

lateinitは、クラス本体定義で簡単に初期化できないnull以外のオブジェクト参照です。

+1

特にKotlin 1.2のリリースと 'isInitialized'の導入により、プロパティを初期化しないままにしておくことは大変意味があります。おそらく0と-1が両方の正当な値を初期化した後? – msrd0

関連する問題