Saya mencoba mencari cara untuk mendeklarasikan variabel statis yang hanya dibatasi secara lokal ke fungsi di Swift.
Di C, ini mungkin terlihat seperti ini:
int foo() {
static int timesCalled = 0;
++timesCalled;
return timesCalled;
}
Di Objective-C, pada dasarnya sama:
- (NSInteger)foo {
static NSInteger timesCalled = 0;
++timesCalled;
return timesCalled;
}
Tapi sepertinya saya tidak bisa melakukan hal seperti ini di Swift. Saya sudah mencoba mendeklarasikan variabel dengan cara berikut:
static var timesCalledA = 0
var static timesCalledB = 0
var timesCalledC: static Int = 0
var timesCalledD: Int static = 0
Tapi ini semua menghasilkan kesalahan.
- Keluhan pertama "Properti statis hanya dapat dideklarasikan pada jenis".
- Keluhan kedua "Deklarasi yang diharapkan" (di mana
static
) dan "Pola yang diharapkan" (di manatimesCalledB
) - Keluhan ketiga "Pernyataan berurutan pada sebuah baris harus dipisahkan oleh ';'" (dalam spasi antara titik dua dan
static
) dan "Jenis yang Diharapkan" (di manastatic
) - Keluhan keempat "Pernyataan berturut-turut pada sebuah baris harus dipisahkan oleh ';'" (di antara
Int
danstatic
) dan "Deklarasi yang diharapkan" (di bawah tanda sama dengan)
struct Holder {…}
di dalam beberapa fungsi dan mereka tidak akan bertabrakan. Swift dapat mendukungstatic let
tanpastruct
boilerplate ini .Solusi lain
sumber
Swift 1.2 dengan Xcode 6.3 sekarang mendukung statis seperti yang diharapkan. Dari catatan rilis Xcode 6.3 beta:
Tampaknya fungsi tidak dapat berisi deklarasi statis (seperti yang ditanyakan). Sebaliknya, deklarasi harus dilakukan di tingkat kelas.
Contoh sederhana yang menampilkan properti statis yang bertambah di dalam fungsi kelas (alias statis), meskipun fungsi kelas tidak diperlukan:
Keluaran:
sumber
static
mungkin disengaja dari pihak Apple, meskipun seseorang selalu dapat melaporkan bug untuk meminta perubahan. Dalam C,static
membatasi penyimpanan variabel ke lingkup file-sumber (yang tidak selalu sama dengan cakupan kelas), sedangkan penempatan deklarasi variabel menentukan cakupan leksikal (yaitu global vs dalam fungsi vs banyak-bersarang{}
). Di Swift, cakupan penyimpanan selalu mengikuti cakupan leksikal, jadi Anda tidak bisa memiliki variabel yang leksikal ke suatu fungsi dan yang memiliki penyimpanan global.Solusi lain
sumber