亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Kotlin 可以動態為對象綁定一個額外對象嗎?

Kotlin 可以動態為對象綁定一個額外對象嗎?

海綿寶寶撒 2019-05-12 15:03:14
我有一個方法,每次都必須傳入一個固定的對象paint,因為這個函數會被頻繁調用,所以我不能在內聯函數中創建對象。inlinefunCanvas.drawPoint(point:PointF,paint:Paint){drawPoint(point.x,point.y,paint)}但是我很多地方都會調用這個方法。//(Canvas.apply(..,..))drawPoint(pointA,pointPaint)drawPoint(pointB,pointPaint)drawPoint(pointC,pointPaint)drawPoint(pointD,pointPaint)可以看到每次都會傳入一個pointPaint對象。所以我在想有沒有類似這樣一個功能//(Canvas.apply(..,..))bind(pointPaint)drawPoint(pointA)drawPoint(pointB)drawPoint(pointC)drawPoint(pointD)
查看完整描述

2 回答

?
四季花海

TA貢獻1811條經驗 獲得超5個贊

完美符合你要求的方式肯定是沒有的,因為bind函數不可能改變另一個函數內部的局部變量。
折中的方式也有很多,比如定義一個包級屬性:
vardrawPaint:Paint?=null
然后原來的函數改為:
inlinefunCanvas.drawPoint(
point:PointF,
paint:Paint){
paint?.let{
drawPoint(point.x,point.y,it)
}
}
方便使用還可以再定義一個函數來確保drawPaint能被準確的賦值和釋放:
funbindPaint(paint:Paint,action:()->Unit){
drawPaint=paint
action()
drawPaint=null
}
這樣使用時就是:
//Canvas().apply{
bindPaint(somePaint){
drawPoint(x,y)
}
還有一種方式是定義一個包裝類,并在其中定義一個包含帶接收者Lambda表達式的參數的函數(接收者為Canvas),然后將擴展函數定義到這個類中:
classPointPainter(privatevalpaint:Paint){
funCanvas.drawPoint(rect:RectF){
drawPoint(rect.x,rect.y,paint)
}
}
然后定義含有接收者為這個包裝對象Lambda參數的函數:
funbindPointPainter(paint:Paint,drawAction:PointPainter.()->Unit){
PointPainter(paint).drawAction()
}
這樣用時更方便一些:
//incanvas.applyblock
bindPointPainter(somePaint){
drawPoint(rect1)
drawPoint(rect2)
//...
}
                            
查看完整回答
反對 回復 2019-05-12
?
MYYA

TA貢獻1868條經驗 獲得超4個贊

funtest(){
Canvas().bindPaintDrawPoints(Paint())(
arrayOf(PointF(1f,2f),
PointF(2f,2f),
PointF(3f,2f),
PointF(4f,2f))
)
}
funCanvas.bindPaintDrawPoints(paint:Paint):(Array)->Unit{
return{
drawPoints(paint,it)
}
}
funCanvas.drawPoints(paint:Paint,points:Array){
for(pinpoints){
this.drawPoint(p.x,p.y,paint)
}
}
                            
查看完整回答
反對 回復 2019-05-12
  • 2 回答
  • 0 關注
  • 408 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號