Daftar Sintaks Deklarasi Blok
Sepanjang, mari
return_type
menjadi jenis objek / primitif / dll. Anda ingin kembali (biasanya void
)
blockName
menjadi nama variabel dari blok yang Anda buat
var_type
menjadi tipe objek / primitif / dll. Anda ingin memberikan argumen (kosongkan tanpa parameter)
varName
menjadi nama variabel dari parameter yang diberikan
Dan ingat bahwa Anda dapat membuat parameter sebanyak yang Anda inginkan.
Blok sebagai Variabel
Mungkin yang paling umum untuk deklarasi.
return_type (^blockName)(var_type) = ^return_type (var_type varName)
{
// ...
};
Blok sebagai Properti
Sama seperti mendeklarasikan blok sebagai variabel, namun agak berbeda.
@property (copy) return_type (^blockName) (var_type);
Blok sebagai Parameter
Perhatikan bahwa ini berbeda dari "Blokir sebagai Argumen"; dalam contoh ini, Anda mendeklarasikan metode yang menginginkan argumen blok.
- (void)yourMethod:(return_type (^)(var_type))blockName;
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.
[someObject doSomethingWithBlock: ^return_type (var_type varName)
{
//...
}];
Blok Anonim
Ini secara fungsional blok anonim, namun sintaks untuk menetapkan blok ke variabel hanya untuk mengatur variabel sama dengan blok anonim.
^return_type (var_type varName)
{
//...
};
typedef
Blok
Ini memungkinkan Anda untuk mengatur nama pendek yang dapat direferensikan sama seperti nama kelas lainnya selama deklarasi blok.
typedef return_type (^blockName)(var_type);
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.
^return_type (var_type varName)
{
//...
}(var);
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.
__block return_type (^blockName)(var_type) = [^return_type (var_type varName)
{
if (returnCondition)
{
blockName = nil;
return;
}
// ...
} copy];
blockName(varValue);
Blok Pengembalian
Metode dapat mengembalikan blok,
- (return_type(^)(var_type))methodName
{
// ...
}
seperti yang bisa fungsi, jika agak aneh.
return_type (^FunctionName())(var_type)
{
// ...
}
Adendum
Jika saya melewatkan sesuatu, beri tahu saya dalam komentar, dan saya akan meneliti / menambahkannya.
Oh, dan di Swift ...
blockName = (varName: var_type) -> (return_type)
Ini hampir seperti fitur bahasa.