关闭
闭包คือ功能ที่ไม่ต้องประกาศชื่อ功能ไม่ต้องมี关键字Funcนำหน้า……..เพื่อนๆอาจเกิดคำถามว่าเพื่ออะไร? Functionาๆงั้นเรามาดูต่อกันว่าไอเจ้า功能พิลิกกึกกือแบบนี้เราจะใช้มันในสถานการณ์แบบไหนได้บ้าง
闭包จะใช้ในกรณีที่เราอยากส่ง函数ไปเป็น参数ของอีกFunctionหรือให้函数。 Returnาร返回函数ออกมา…ยิ่งพูดยิ่งงงมาลองดูตัวอย่างกันดีกว่า
复仇者联盟3英雄级别英雄级别英雄级别英雄级别
英雄级{
在里面()
{
打印(“我是英雄”)
}
funcpunch()
{
打印(“我可以打孔”)
}
funk kick()
{
打印(“我可以踢”)
}
}
งใช้องใช้Heroของเรากันดู
let ironMan = Hero()//我是英雄
ironMan.punch()//我可以打孔
ironMan.kick()//我可以踢
จะให้ราวนี้เราจะให้Heroของเราสามารถเรนยนรู้สกิลใหม่ๆมาใช้งานได้เช่นน,ยิงจรวด,ยิงเลเซอร์,หายตัว,เปิดเกราะกำบัง…。 สกิลอีกมากมายนับร้อยสกิล………..อืม…มีสกิลมากมาย….. าเป็น绿巨人ก็ไม่จำเป็นต้องบินได้แปลว่าในแต่ละHero。 ังไงดีกักักักักัๆกแบบคลๆ
งาลองทำกันเริ่มจากสร้าง关闭技能ต่างๆไว้ดังนี้
var fly:()->()= {()in print(“ i can fly”)}
var fireRocket:()->()= {()in print(“ Locktarget-> Fire the rocker-> Boom!”)}
เพิ่ม功能使用技巧ใน类英雄ของเรา
英雄级{
在里面()
{
打印(“我是英雄”)
}
funcpunch()
{
打印(“我可以打孔”)
}
funk kick()
{
打印(“我可以踢”)
}
func useSkill(技能:()->())
{
技能()
}
}
let ironMan = Hero()//我是英雄
ironMan.punch()//我可以打孔
ironMan.kick()//我可以踢
ironMan.useSkill(技能:飞行)//我可以飞行
ironMan.useSkill(技能:fireRocket)// Locktarget-> Fire the rocker-> Boom!
จะเห็นว่า功能useSkillที่เพิ่มเข้ามานั้นมีหน้าที่เพียงแค่รับค่า技能มาแล้วใช้เท่านั้นเองซึ่งจริงๆแล้วก็คือการส่งFunctionไปเป็น参数ให้อีกFunctionหนึ่งเรียกใช้นกใช้นั้นเอเอง…..ซึ่งถ้าใครเห็น语法ของ关闭แล้วงงๆแล้วงงๆรามาต่อกันเลยครับ
句法
var fly2:字符串=“我可以飞”
ตัวแปลาเราสร้างตัวแปลใดๆก็จะประกอบไปด้วยชื่อตัวแปล,ชนิดตัวแปล,ค่าของตัวแปลดังรูป
Stringราจำเป็นต้องระบุค่าของตัวแปลให้ตรงกับชนิดที่เรากำหนดซึ่งในตัวอย่างด้านล่างนี้เรากำหนดชนิดนิดนStringแต่ใส่ค่า4ซึ่งเป็นชนิดIntก็จะเกิดErrorทันที(ชนิดสัมพันธ์กับค่า)
var fly2:String = 4 //错误
sure语法ดังนี้
()->()
วงเล็บที่สรกคือที่ใช้กำหนที่ใช้กำหนด参数วงเล็บที่สองใช้กำหนดค่าที่จะ返回
()->()//ไม่รับค่า参数และไม่Returnอะไร
(Int)->()//参数参数เป็นIntและไม่Returnอและไม่ร
(Int,Int)->()//รับค่า参数เป็นIntสองค่าและไม่Returnอะไร
(Int,Int)->(Int)//返回参数เป็นIntสองค่าและReturn Int
งรงร้าและองClosureก็มีแค่(块参数)และ(块返回语句)านี้หละครับง่ายๆทีนี้มาลองใส่ค่าให้แต่ละตัวแปลกัน
var a:()->()= {()in}
var b:(Int)->()= {{}
var c:(Int,Int)->()= {在{(number1,number2)中
var d:(Int,Int)->(Int)= {(返回number1 + number2中的(number1,number2)}
Synราขน语法ของตัว闭包ชัดเจนแล้วนะครับ。
{(在返回语句中的参数)}
ยาวไปมาลดรูปกัน
การที่เราประกาศตัวแปลแล้วระบุค่าให้เลยก็จะเป็นการประกาศชนิดตัวแปลไปในตัวทันทีดังตัวนทีดังตัวอย่างด้านล่างนี้
var fly2:字符串=“我可以飞”
var fly3 =“我可以飞”
Cloราะฉนั้น关闭ก็แบบเดียวกัน
var a:()->()= {()in}
var b:(Int)->()= {{}
var c:(Int,Int)->()= {在{(number1,number2)中
var d:(Int,Int)->(Int)= {(返回number1 + number2中的(number1,number2)}
var a = {()in}
var b = {(}中的(int:Int)
var c = {(}中的(number1:Int,number2:Int)
var d = {(number1:Int,number2:Int)返回number1 + number2}
าตรง返回陈述มีบรรทัดเดียวเราสามารมตัด关键字Returnออกได้
var d = {{number1:Int,number2:Int)in number1 + number2}
sureรจบเท่องการลดรูปClosureจบเท่านี้ก็น่าจะกำลังดีไม่งงแต่แถมอีกแบบเพราะเราจะเจอกับมันบ่อยคือการประกาศชนิดก่อนิดก่รูปด้านในClosureแบบนี้
var d:(Int,Int)-> Int = {$ 0 + $ 1}
var e:(Int,Int,Int)-> Int = {$ 0 + $ 1 + $ 3}
封闭式เป็น参考类型
var sayHello =“大家好”
var thanos = {()在
打印(sayHello)
}
thanos()//大家好
sayHello =“我会杀了你”
thanos()//我会杀了你
闭店闭店储值ไหนให้ใช้捕获列表แบบนี้ครับ
var sayHello =“大家好”
var thanos = {[sayHello]()在
打印(sayHello)
}
thanos()//大家好
sayHello =“我会杀了你”
thanos()//大家好
Cloรามักจะเห็นClousreนำไปใช้งานบ่อยๆก็พวกการทำ完成手กันใช้มั้ยครับงั้นวันนี้เรามาลองทำกันดู
งทำ完成ลกัน
func avengersLogin(completion:(Bool)->()){
为_ in 1 ... 100
{
打印(“处理中”)
}
完成度(true)
}
เสร็จแล้วลองเรียกใช้ดูดังนี้
avengersLogin(完成:{成功
如果成功==真
{
打印(“登录成功,您是英雄”)
}
})
completionนช่อง参数完成เราก็โยน闭包เข้าไปตรงๆแบบนี้ก็ได้
{()in()} //ถ้าใครงงยังจำกันได้เนอะ
ังไม่จบ
จะจบาจะจบ博客ละนึกขึ้นได้ยังมี闭包环ll clo
拖网状群
กราอามารถลากClosureออกมาจากFunctionเพื่อให้ดูง่ายๆดังนี้
avengersLogin(){如果成功,则成功== true {/ *做某事* /}}
งาวงเล็บปิดของ函数ปิดไปแล้วนะครับแต่เราเอา完成闭包มาต่อท้ายเฉยๆแบบนี้เลยก็ได้
สรุป
Cloนนี้เราได้เรียนรู้วิธีใช้งาน封闭สรู้ว่าทำไมเราถึงใช้封闭สรุปสั้นๆแบบนี้หละครับฮ่าๆ
ใหม่อกันใหม่博客หน้าครับขอบคุณทุกคนที่มาอ่านด้วยนะครับ