It would be great if B4X supported ternary operators so we could do inline if statements. Consider this scenario:
I have a SQLite database table that I want to store a boolean value in. SQLite doesn't support booleans, so I have to use an integer type for the field, then convert int values pulled from the database to boolean & vis-a-vis when saving values to the table. So one way to do this is:
B4X:
Private Sub dbStuff
...
Private boolVal = toBool(Cursor.GetInt("boolasint"))
....
SQL1.ExecNonQuery($"UPDATE table SET boolasint=${fromBool(boolVal)} WHERE..."$
End Sub
Private Sub toBool(val as Int) as Boolean
If val = 0 Then Return False Else Return True
End Sub
Private Sub fromBool(val as Boolean) as Int
If val Then Return 1 Else Return 0
End Sub
However it would be much easier & more efficient if I could just write:
B4X:
Private Sub sbStuff
...
Private boolVal = Cursor.GetInt("boolasint") = 0 ? False : True
....
SQL1.ExecNonQuery($"UPDATE table SET boolasint=${boolval = True ? 1 : 0} WHERE..."$
'(or even better)
SQL1.ExecNonQuery($"UPDATE table SET boolasint=${boolval ? 1 : 0} WHERE..."$
End Sub
I am sticking my neck out here, very new on the block,
but i just tested this, and it works:
Dim s As String = "False"
Dim b As Boolean = True
b = s
If not(b) Then Msgbox("This works", "...")
So, if you have s(0) = "False" and s(1) = "True"
you could use your retrieved s(cursor.GetInt("boolasint")) as index and save some code.
The examples you gave can be streamlined without the ternary operator.
B4X:
Private Sub sbStuff
Private boolVal As Boolean = Cursor.GetInt("boolasint")==1
SQL1.ExecNonQuery($"UPDATE table SET boolasint=${IIF(boolVal,1,0)}....
End Sub
Public Sub IIF(condition As Boolean, TrueValue As Object, FalseValue As Object) As Object
If condition Then Return TrueValue
Return FalseValue
End Sub
The real strength of a ternary operator is when you want to enforce lazy evaluation. For example
B4X:
Dim x As Double = IIF(y<>0, 100/y, 100)
will cause a divide-by-zero Exception when y==0 because the 100/y argument is evaluated regardless of the truthiness of y<>0. In this case, we really do need a ternary operator to get all this on one line without Exceptions:
B4X:
Dim x As Double = y<>0 ? 100/y : 100
Another example is when evaluating one of the arguments entails a very lengthy (and potentially unnecessary) calculation or DB access. However, if your scenario doesn't demand lazy evaluation, you can accomplish it with the IIF function (or something like it).