/**
* 综下:使用let会返回一个叫it的该对象,当然了,it是可以改名字的,用lamda表达式,我觉得let主要是用于非空判断的
*/
private fun ktLetUsage() {
// 用例1
iv_image.let {
it.setImageResource(R.mipmap.ic_launcher_round)
}
// 等价于,但是其实你看这里的let会有一个黄色的提示的标志,as会提示你删除掉let,因为这里的let没什么必要
iv_image.setImageResource(R.mipmap.ic_launcher_round)
// 用例2
seekBar?.progress?.let {
PlayerManager.ximalayaPlayer.seekToByPercent(it / 100f)
}
// 等价于,但是你看这里的seekBar?.progress是用了断言的,这样很不好,因为很多时候你都没办法判断这个参数是不是一定不为空,所以这里推荐使用let
PlayerManager.ximalayaPlayer.seekToByPercent(seekBar?.progress!! / 100f)
}
/**
* 综下可知:apply主要是用于设置值并且返回该对象
* 简单来说,apply就是,方便多个设置值,且可以返回该对象
*/
private fun ktApplyUsage() {
// 用例1
//apply之后花括号里面就有一个对应的类型,就是说,apply里面会返回一个该类型的对象,你可以这个对象来设置值,或者用来做返回值都可以
iv_image.apply {
setImageResource(R.mipmap.ic_launcher_round)
}
// 上面的用法等同于,因为这里没用到iv_image的返回值,所以其实这里看不出来什么
iv_image.setImageResource(R.mipmap.ic_launcher_round)
// 用例2
SearchHistoryFragment().apply {
arguments = Bundle().apply {
putInt("test", 1)
}
}
// 等价于 所以说,上面的第二个apply的花括号里面返回的bundle对象就被赋值给了arguments
val bundle = Bundle()
bundle.putInt("test", 1)
SearchHistoryFragment().arguments = bundle
// 等价于
SearchHistoryFragment().apply {
arguments = bundle
}
// 等价于
SearchHistoryFragment().arguments = Bundle().apply {
putInt("test", 1)
}
// 如果想直接 SearchHistoryFragment().arguments = Bundle(). putInt("test", 1) 是不行 的,因为这里的putInt是没得返回值的
// 用例3
arguments?.apply {
type = getInt("test", 1)
}
// 等价于,但是你看这里用了断言,但是断言其实不是很好,因为有时候你是不确定这个值是不是一定不为空的,所以还是apply香
type = arguments?.getInt("test", 1)!!
}
项目中美用到过with的用法,且看别人写的用法也看不懂,这里就不写啦
咋又看不懂了。。。哎