Why do I need to initialize a var with a custom getter, that returns a constant?
var greeting: String // Property must be initialized
get() = \
Your code does not have a custom setter, so it is equivalent to:
var greeting: String
get() = "hello"
set(v) {field = v} // Generated by default
The default implementation of set uses field, so you've got to initialise it.
By the same logic, you don't have to init the field if nether your set nor get use it (which means they are both custom):
var greeting: String // no `field` associated!
get() = "hello"
set(v) = TODO()