รายการบล็อกการประกาศที่ถูกบล็อก
ให้ทั่ว
return_type
เป็นประเภทของวัตถุ / ดั้งเดิม / ฯลฯ คุณต้องการที่จะกลับมา (ปกติvoid
)
blockName
เป็นชื่อตัวแปรของบล็อกที่คุณกำลังสร้าง
var_type
เป็นวัตถุชนิด / ดั้งเดิม / ฯลฯ คุณต้องการผ่านเป็นอาร์กิวเมนต์ (ปล่อยว่างไว้โดยไม่มีพารามิเตอร์)
varName
เป็นชื่อตัวแปรของพารามิเตอร์ที่กำหนด
และจำไว้ว่าคุณสามารถสร้างพารามิเตอร์ได้มากเท่าที่คุณต้องการ
บล็อกเป็นตัวแปร
อาจเป็นเรื่องธรรมดาที่สุดสำหรับการประกาศ
return_type (^blockName)(var_type) = ^return_type (var_type varName)
{
// ...
};
บล็อกเป็นคุณสมบัติ
คล้ายกับการประกาศบล็อกเป็นตัวแปร แต่แตกต่างกันเล็กน้อย
@property (copy) return_type (^blockName) (var_type);
บล็อกเป็นพารามิเตอร์
โปรดทราบว่าสิ่งนี้แตกต่างจาก "บล็อกเป็นอาร์กิวเมนต์"; ในตัวอย่างนี้คุณกำลังประกาศวิธีที่ต้องการโต้แย้งอาร์กิวเมนต์
- (void)yourMethod:(return_type (^)(var_type))blockName;
บล็อกเป็นอาร์กิวเมนต์
โปรดทราบว่าสิ่งนี้แตกต่างจาก "บล็อกเป็นพารามิเตอร์"; ในตัวอย่างนี้คุณกำลังเรียกวิธีการที่ต้องการโต้แย้งอาร์กิวเมนต์ด้วยบล็อกที่ไม่ระบุชื่อ หากคุณได้ประกาศตัวแปรบล็อกแล้วมันก็เพียงพอที่จะผ่านชื่อตัวแปรเป็นอาร์กิวเมนต์
[someObject doSomethingWithBlock: ^return_type (var_type varName)
{
//...
}];
บล็อกนิรนาม
นี่คือบล็อกที่ไม่ระบุชื่อที่ใช้งานได้อย่างไรก็ตามไวยากรณ์สำหรับการกำหนดบล็อกให้กับตัวแปรนั้นเป็นเพียงการตั้งค่าตัวแปรให้เท่ากับบล็อกที่ไม่ระบุชื่อ
^return_type (var_type varName)
{
//...
};
typedef
บล็อก
สิ่งนี้อนุญาตให้คุณตั้งค่าชื่อแบบสั้นที่สามารถอ้างอิงได้เช่นเดียวกับชื่อคลาสอื่น ๆ ในระหว่างการประกาศบล็อก
typedef return_type (^blockName)(var_type);
หากต้องการใช้ในภายหลังblockName
แทนไวยากรณ์ประกาศบล็อกมาตรฐานเพียงแทนที่
บล็อกแบบอินไลน์
นี่เป็นการใช้ประโยชน์จากบล็อกที่มีประโยชน์น้อยกว่า แต่อาจมีตำแหน่งได้ บล็อกแบบอินไลน์คือบล็อกนิรนามที่ถูกเรียกใช้ทันทีหลังจากการสร้างอินสแตน
^return_type (var_type varName)
{
//...
}(var);
บล็อกแบบอินไลน์มีประโยชน์อย่างยิ่งสำหรับการชดเชยขอบเขตและโดยคร่าว ๆ จะเทียบเท่ากับชิ้นส่วนของรหัสที่ใช้วงเล็บปีกกาแบบง่ายๆ
{
//...
}
บล็อกแบบเรียกซ้ำ
สิ่งนี้ช่วยให้คุณสามารถเรียกบล็อกจากตัวเองสร้างวงที่สามารถใช้ในระหว่างการโทรกลับและโทร GCD วิธีการสร้างอินสแตนซ์นี้ไม่มีการวนรอบใน ARC
__block return_type (^blockName)(var_type) = [^return_type (var_type varName)
{
if (returnCondition)
{
blockName = nil;
return;
}
// ...
} copy];
blockName(varValue);
การกลับมาบล็อก
วิธีสามารถส่งคืนบล็อก
- (return_type(^)(var_type))methodName
{
// ...
}
เช่นเดียวกับฟังก์ชั่นถ้าบิตแปลก
return_type (^FunctionName())(var_type)
{
// ...
}
แนบท้าย
หากฉันไม่ได้รับอะไรเลยโปรดแจ้งให้เราทราบในความคิดเห็นและฉันจะทำการวิจัย / เพิ่มพวกเขา
โอ้และในสวิฟท์ ...
blockName = (varName: var_type) -> (return_type)
มันเกือบจะเหมือนเป็นคุณสมบัติทางภาษา