รวดเร็ว: การประกาศปิดเช่นเดียวกับการประกาศบล็อก


90

เราสามารถประกาศบล็อกดังต่อไปนี้ใน Objective-C

typedef void (^CompletionBlock) (NSString* completionReason);

ฉันพยายามทำสิ่งนี้อย่างรวดเร็วมันให้ข้อผิดพลาด

func completionFunction(NSString* completionReason){ }
typealias CompletionBlock = completionFunction

ข้อผิดพลาด: การใช้ 'completeFunction' ที่ไม่ได้ประกาศ

คำจำกัดความ:

var completion: CompletionBlock = { }

ต้องทำอย่างไร?

อัปเดต:

ตามคำตอบของ @jtbandes ฉันสามารถสร้างการปิดโดยมีอาร์กิวเมนต์หลายรายการได้ตามต้องการ

typealias CompletionBlock = ( completionName : NSString, flag : Int) -> ()

1
@Downvotters: กรุณาอธิบายว่าคำถามนี้มีอะไรผิดปกติ?
มานี

1
มีคนจำนวนมากรู้สึกว่าเราควรเรียนรู้ภาษาที่รวดเร็วก่อนแล้วจึงเขียน ความรู้สึกโง่เขลา ...
Janak Nirmal

@Mani สวัสดีคุณช่วยดูว่าคุณจะกำหนดนามแฝงประเภทนั้นให้กับ a ได้อย่างไรvar(เช่นvar completion: CompletionBlock = {....}ใช้หลายอาร์กิวเมนต์ได้หรือไม่ขอบคุณ
Unheilig

คำตอบ:


141

ไวยากรณ์สำหรับประเภทฟังก์ชั่น(in) -> outคือ

typealias CompletionBlock = (NSString?) -> Void
// or
typealias CompletionBlock = (result: NSData?, error: NSError?) -> Void
var completion: CompletionBlock = { reason in print(reason) }
var completion: CompletionBlock = { result, error in print(error) }

โปรดทราบว่าวงเล็บรอบประเภทอินพุตจำเป็นสำหรับ Swift 3+ เท่านั้น


หากใช้ข้อโต้แย้งมากกว่าสองข้อเราจะทำเช่นนั้นได้อย่างไร? คุณช่วยแนะนำให้ฉันอ้างอิงในหนังสือเล่มนั้นหรืออื่น ๆ ได้ไหม
มานี

หนังสือที่ดีที่สุดสำหรับ Swift: Apple Inc. “ The Swift Programming Language” iBooks itun.es/ca/jEUH0.l
David Skrundz

@NSArray ฉันรู้ว่ามีหนังสือเล่มเดียวเท่านั้นที่สามารถใช้ได้อย่างรวดเร็ว แต่ฉันกำลังถามเกี่ยวกับบทที่เกี่ยวข้องกับหัวข้อ ... :)
Mani

4
@jtbandes มันใช้งานได้ ฉันได้สร้างขึ้นโดยมีสองอาร์กิวเมนต์เป็นtypealias CompletionBlock = ( completionName : NSString, flag : Int) -> ()
Mani

@zumzum มันแยกชื่อพารามิเตอร์ " reason" ออกจากตัวเมธอด " println(reason)"
jtbandes

13

นี่คือบล็อกที่ยอดเยี่ยมเกี่ยวกับการปิดอย่างรวดเร็ว

นี่คือตัวอย่างบางส่วน:

เป็นตัวแปร:

var closureName: (inputTypes) -> (outputType)

เป็นตัวแปรเสริม:

var closureName: ((inputTypes) -> (outputType))?

เป็นนามแฝงประเภท:

typealias closureType = (inputTypes) -> (outputType)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.