表达式

简介

为了实现弱逻辑动态性,我们定义了表达式语法,可以在databinding文件中使用。

基础类型

  • 布尔类型 bool

    • 可取值:true false

    • 描述:

      iOS端 对应 NSNumber类型,Android端 对应 Boolean类型。

  • 数字类型 number

    • 示例:11.01.0010.001

    • 描述:

      支持Float类型以及Long类型。

      iOS端 对应 NSNumber,Android 对应 Number

      当数值带小数点如1.0时,识别为Float类型,当数值不带小数点如1时,识别为Long类型。

  • 字符串类型 string

    • 描述:

      iOS端 对应 NSString,Android端 对应 String

    • 注意事项:

      在表达式中必须使用单引号标识出来,例如:'string'

      当使用形如#000000等16进制颜色值时,也需要使用单引号'把颜色值括起来,否则不生效。

语法

支持的语法格式

  • 获取原始数据源
$$ 
  • 常量字符串
"'hello world'"
  • 取值表达式
$a.b
  • 三元表达式
a ? b : c
a ?: c
  • 条件判断 (&&,||,==,>,>=,<,<=)
$a == 'b'
$a.c && $a.b
  • 计算表达式 (+,-,*,/,%)
$a.string + 'string'
$a.num + 100
$a.num - 100
$a.num * 100
$a.num / 100
$a.num % 100
  • 环境变量
env('appVersion')
  • 函数
// 数据有效判断,支持string,array,dictionary,返回int
size($a)

表达式类型

取值表达式

  • 详情:

    最常用的就是取值表达式了,这里的取值的特指外部传入的数据。

    Android: JSONObject iOS: NSDictionary。

// 语法格式与含义:
$$ 											//获取原始数据
$title 							    //字符串
$data[0]	 							//数组
$data.title	 						//字典
$data.items[0].title	 	//字典和数组嵌套

条件表达式

  • 详情:

    条件表达式,一般特质三元表达式,通过?:的形势,判断真假,并返回一个结果。

  • 注意事项:

    嵌套使用条件表达式时,务必使用()对嵌套的三元表达式做好优先级划分。

    条件的结算结果需要为真值或假值:

    真值:"true" true 1

    假值:"false" false 0

// 语法格式:
// 形式1
a ? b : c
$data.title ? 'flex' : 'none'
$data.backgroundColor ? $data.backgroundColor : 'green'

// 形式2
a ?: b
$data.backgroundColor ?: 'green'
$data.title ?: $data.nodes[0].title

判断表达式

  • 详情:

    判断表达式结果为bool类型,通常作为条件,配合三元表达式来使用

    支持的运算符:==、!=、>、>=、<、<=、&&、||

    左值与右值支持如下:

    • 取值表达式
    • 条件表达式
    • 布尔值 (true / false)
    • 数字值 (0/1/2/3....)
    • 字符值 ('A,'ABC','ABCD')
// 语法格式与含义: 
$data.title == 0 //为数字时,同时还支持以下运算符 >、>=、<、<=、!=
$data.title == 'string'//为字符串时,同时支持一下运算符 != ,&&, ||
$data.title == $data.subtitle//为对象时,同时支持一下运算符 != ,&&, ||
$data.title && $data.show

//结合三元表达式
$data.title == '' ? 'none' : 'flex'
或
($data.title == '') ? 'none' : 'flex'

计算表达式

  • 详情:

    支持的运算符:+、-、*、/、%

    左值与右值支持如下:

    • 取值表达式
    • 数字值 (0/1/2/3....)
    • 字符值 ('A,'ABC','ABCD')
// 语法格式与含义:
'字符串1' + $data.title 				   //字符串拼接
'字符串1' + $data.title + '字符串2' 		//字符串拼接
'字符串1' + $data.title + $data.desc  	//字符串拼接
100 + $data.num							//数值加法
100 - $data.num							//数值减法
100 * $data.num							//数值乘法
100 / $data.num							//数值除法(分母不能为0)
100 % $data.num							//数值取余
  • 注意事项: 计算表达式可通过控制小数点位数实现保留小数点后n位的能力
// 如需保留n位小数,则在计算时可以给运算添加n位小数点
10 + 10.0 = 20.0
10 + 10.00 = 20.00
2.25 * 2 = 4.50
……

函数表达式

env

  • 详情:

    依赖于业务实现和扩展。啊

已实现:

//环境变量(依赖于业务实现: env() -> 返回值Any
定义:
	env('isiOS')
返回值:
	Android: true/false iOS: 1/0

//是否android 
定义:
	env('isAndroid')
返回值:
	Android: true/false iOS: 1/0

size

  • 详情:

    判断字符串,数组,字典是否为有效数据

  • 注意事项:

    目前函数方法中的参数不支持除直接传值和取值表达式外的其他运算。

//获取数组/字典的count/字符串:  size() -> int
size(string)
size(array)
size(dict)

//例子
size($data.nodes)

自定义函数

  • 详情:

    接入方可以通过扩展能力为GaiaX提供自定义的函数处理能力

  • 扩展函数:

GXRegisterCenter.default().registerFunctionExpression(...)
GXRegisterCenter.instance.registerExtensionFunctionExpression(...)
  • 案例:

iOS可以参考:https://github.com/alibaba/GaiaX/blob/main/GaiaXiOS/GaiaXiOSTests/TestCase/GXExpressionExtendTest.swift在新窗口打开

Android可以参考:https://github.com/alibaba/GaiaX/blob/main/GaiaXAndroid/src/androidTest/java/com/alibaba/gaiax/GXCommonExpressionTest.kt在新窗口打开