Blok sintaksis di Objective C (dan memang C, saya kira) terkenal tidak sesuai. Melewati blok sebagai argumen terlihat berbeda dari mendeklarasikan blok sebagai ivar, yang terlihat berbeda dari typedef
blok.
Apakah ada daftar lengkap sintaksis blok-deklarasi yang bisa saya pertahankan untuk referensi cepat?
objective-c
syntax
objective-c-blocks
Patrick Perini
sumber
sumber
Jawaban:
Daftar Sintaks Deklarasi Blok
Sepanjang, mari
return_type
menjadi jenis objek / primitif / dll. Anda ingin kembali (biasanyavoid
)blockName
menjadi nama variabel dari blok yang Anda buatvar_type
menjadi tipe objek / primitif / dll. Anda ingin memberikan argumen (kosongkan tanpa parameter)varName
menjadi nama variabel dari parameter yang diberikanDan ingat bahwa Anda dapat membuat parameter sebanyak yang Anda inginkan.
Blok sebagai Variabel
Mungkin yang paling umum untuk deklarasi.
Blok sebagai Properti
Sama seperti mendeklarasikan blok sebagai variabel, namun agak berbeda.
Blok sebagai Parameter
Perhatikan bahwa ini berbeda dari "Blokir sebagai Argumen"; dalam contoh ini, Anda mendeklarasikan metode yang menginginkan argumen blok.
Blok sebagai Argumen
Perhatikan bahwa ini berbeda dari "Blok sebagai Parameter"; dalam contoh ini, Anda memanggil metode yang ingin argumen blok dengan blok anonim. Jika Anda telah mendeklarasikan variabel blok, cukup untuk meneruskan nama variabel sebagai argumen.
Blok Anonim
Ini secara fungsional blok anonim, namun sintaks untuk menetapkan blok ke variabel hanya untuk mengatur variabel sama dengan blok anonim.
typedef
BlokIni memungkinkan Anda untuk mengatur nama pendek yang dapat direferensikan sama seperti nama kelas lainnya selama deklarasi blok.
Untuk kemudian menggunakan
blockName
alih-alih sintaks deklarasi blok standar, cukup gantikan.Blok sebaris
Ini bisa dibilang merupakan pemanfaatan blok yang kurang bermanfaat, tetapi tetap memiliki tempatnya. Blok inline adalah blok anonim yang dipanggil segera setelah instantiasi.
Blok inline terutama berguna untuk offset ruang lingkup, dan kira-kira setara dengan potongan kode sederhana yang dibatasi oleh tanda kurung.
Blok Rekursif
Ini memungkinkan Anda untuk memanggil blok dari blok itu sendiri, membuat loop yang dapat digunakan selama panggilan balik dan panggilan GCD. Metode instantiasi ini bebas dari siklus penahan di ARC.
Blok Pengembalian
Metode dapat mengembalikan blok,
seperti yang bisa fungsi, jika agak aneh.
Adendum
Jika saya melewatkan sesuatu, beri tahu saya dalam komentar, dan saya akan meneliti / menambahkannya.
Oh, dan di Swift ...
Ini hampir seperti fitur bahasa.
sumber
BlockType ^blockVar = Anonymous Block
menunjukkan kesalahan sintaks, tanpa ^ terlalu :(Saya pribadi suka menggunakan situs web ini ( http://fuckingblocksyntax.com ). Nama ini lebih mudah diingat daripada sintaks blok itu sendiri:
http://fuckingblocksyntax.com
dan jika Anda tidak dapat memuat URL dengan kata-kata buruk di dalamnya, Anda dapat menggunakan mirror ini: http://goshdarnblocksyntax.com
sumber
Typedef:
Di barisan:
Metode:
sumber
Pustaka cuplikan Xcode 4 berisi templat untuk blok typedef dan inline blok sebagai variabel. Mereka juga tersedia melalui pelengkapan otomatis (
typedefblock
daninlineblock
).Untuk blok sebagai argumen untuk metode, saya akan merekomendasikan mendeklarasikan
typedef
dan kemudian hanya menggunakannya. Itu membuat kode lebih mudah dibaca.sumber
Saya menulis sebuahlockBlock untuk kelas yang akan mengembalikan nilai-nilai dadu setelah mereka diguncang:
Tentukan typedef dengan returnType ( deklarasi di
.h
atas@interface
)Tentukan a
@property
untuk blok (.h
)Tetapkan metode dengan
finishBlock
(.h
)Masukkan metode yang didefinisikan sebelumnya dalam
.m
file dan komitfinishBlock
untuk@property
didefinisikan sebelumnyaUntuk memicu
completionBlock
lulus Variabel jenis yang telah ditentukan sebelumnya (Jangan lupa untuk memeriksa apakahcompletionBlock
ada)sumber
sumber
Jika Anda perlu bekerja kembali di Xcode 4.2, Anda juga dapat @ mensintesiskan blok yang dinyatakan sebagai properti seperti yang Anda lakukan dengan properti non blok. Jangan biarkan sintaks blokir melempar Anda.
Jika properti blok Anda adalah ini:
Maka, Anda mensintesis ini:
Bersulang.
sumber
@property blockName
tidak bekerja. Saya pikir itu harus@synthesize blockName;
? (untuk mensintesis satu blok)