2017-02-11 11 views
1

Я надеюсь, что кто-то может помочь, я пишу, переходя из java в Kotlin, и хочу иметь свойство, которое оно инициализируется в блоке init, у которого есть настраиваемый набор, но не является необязательным.Нестандартное свойство с пользовательским сеттером Kotlin

Вот мой код ниже, однако это предупреждение, что тег должен быть инициализирован

Я хотел бы сделать это lateInit, но это означает, что он должен быть факультативным (который я не хочу)

class SkiMarker(mapView: MapView, tag:Tag) : Marker(mapView){ 
var tag:Tag  <- ERROR here 
    set(tag){ 
     this.tag = tag 
     if(tag != null){ 
      this.mPosition = GeoPoint(tag.lat,tag.lon) 
     } 
    } 


init { 
    this.tag   = tag 
    this.mPosition  = GeoPoint(tag.lat,tag.lon) 
    val window   = MyInfoWindow(mapView,tag) 
    this.infoWindow  = window 
    window.subject.observeOn(AndroidSchedulers.mainThread()).subscribe { it -> 
     setIconForTracking(it) 
    } 
    } 
} 

Большое спасибо заранее за любые комментарии

ответ

3

по этой логике нужно только использовать поле подкладочный:

class SkiMarker(mapView: MapView, tag:Tag) : Marker(mapView) { 
    var tag: Tag = tag 
     set(newTag){ 
      field = newTag // `field` is a keyword 
     } 
} 

Обратите внимание, что код типа set(newTag) {tag = newTag} эквивалентен setTag(newTag: Tag) { setTag(newTag) }, где он фактически вызывает сеттер изнутри себя в рекурсии.

Также tag не является null, поэтому if(tag != null) не имеет смысла.

+2

Незначительное примечание, но, возможно, стоит упомянуть соглашение Котлина - использовать параметр «значение» и параметр setter. –