Casting
Casting allows a struct to be converted to either an interface it inherits, or a variant of it.
Syntax
Casting from typeA to typeB can be imagined as a function of the following signature.
fn as(in: typeA, type: Types) -> out: type {
...
}With this model in mind, the syntax for casting follows very naturally:
let myA = typeA()
val myB = myA.as(typeB)When casting, because the underlying memory is not changed, either val or var must be used to receive the result, with the exceptions of primitives.
Interfaces
A struct may be cast into an interface it implements. Either of val or var should be used to receive the result.
let _myClient = SpecificHttpClient()
val myClient = _myClient.as(GeneralHttpClient)Variants
Casting may be used to convert an underlying struct into a variant of that struct. Either of val or var should be used to receive the result.
let myStr = "./path/to/some/file.txt"
val path = myStr.as(path)Primitives
Some primitives support cast operations. By default there is no implicit casting of primitives. When casting primitives, the result should be captured by let, as in this case, we are in fact writing a new memory allocation.
let myInt = 4
let myFlt = myInt.as(flt)