Saya memiliki definisi ini dalam fungsi saya yang berfungsi
class MyClass {
func myFunc() {
let testStr = "test"
let testStrLen = countElements(testStr)
}
}
Tetapi jika saya memindahkan 'testStr' dan 'testStrLen' ke tingkat kelas, itu tidak akan dapat dikompilasi. Dikatakan 'MyClass.Type tidak memiliki anggota bernama' testStr '.
class MyClass {
let testStr = "test"
let testStrLen = countElements(testStr)
func myFunc() {
}
}
Bagaimana cara memperbaikinya? Saya tidak ingin membayar penalti untuk menghitung len dari 'ujian' yang konstan setiap saat.
Berdasarkan pemahaman saya tentang komentar di bawah, saya perlu melakukan ini:
class MyClass {
let testStr = "test"
let testStrLen = countElements("test")
func myFunc() {
}
}
Adakah cara agar saya tidak perlu mengetik / memasukkan "tes" dua kali? Terima kasih.
Jawaban:
Mungkin idiom yang bagus untuk mendeklarasikan konstanta untuk kelas di Swift adalah dengan menggunakan struct bernama MyClassConstants seperti berikut.
Dengan cara ini, konstanta Anda akan dibatasi dalam konstruksi yang dideklarasikan, bukan mengambang secara global.
Memperbarui
Saya telah menambahkan konstanta array statis, sebagai tanggapan atas komentar yang menanyakan tentang inisialisasi array statis. Lihat Array Literals dalam "The Swift Programming Language".
Perhatikan bahwa literal string dan konstanta string dapat digunakan untuk menginisialisasi array. Namun, karena tipe array diketahui, konstanta integer
testStrLength
tidak dapat digunakan dalam penginisialisasi array.sumber
static
konstanta inStruct
dan inClass
es?MyClassConstants.testStr.rawValue
untuk mengakses nilai, yang tidak semudah sintaksisMyClassConstants.testStr
.Menambah jawaban @ Martin ...
Jika ada yang berencana untuk menyimpan file konstanta level aplikasi, Anda dapat mengelompokkan konstanta berdasarkan jenis atau sifatnya
Telepon:
Constants.MixpanelConstants.activeScreen
UPDATE 5/5/2019 (agak keluar topik tapi 🤷🏽♂️)
Setelah membaca beberapa pedoman kode & dari pengalaman pribadi, tampaknya struct bukanlah pendekatan terbaik untuk menyimpan konstanta global karena beberapa alasan. Terutama kode di atas tidak mencegah inisialisasi struct. Kita bisa mencapainya dengan menambahkan beberapa kode boilerplate tetapi ada pendekatan yang lebih baik
ENUM
Hal yang sama dapat dicapai dengan menggunakan enum dengan representasi yang lebih aman & jelas
sumber
Jika saya memahami pertanyaan Anda dengan benar, Anda bertanya bagaimana Anda dapat membuat konstanta tingkat kelas (statis - dalam bahasa C ++) sedemikian rupa sehingga Anda tidak a) mereplikasi overhead di setiap contoh, dan b harus menghitung ulang apa yang dinyatakan konstan.
Bahasanya telah berkembang - seperti yang diketahui setiap pembaca, tetapi saat saya menguji ini di Xcode 6.3.1, solusinya adalah:
Saya tidak tahu apakah statis sangat diperlukan karena kompiler pasti hanya menambahkan hanya satu entri per variabel const ke bagian statis biner, tetapi itu mempengaruhi sintaks dan akses. Dengan menggunakan statis, Anda dapat merujuk ke sana bahkan ketika Anda tidak memiliki sebuah contoh:
MyClass.testStrLen
.sumber
Jika Anda benar-benar menginginkan properti statis kelas Anda, yang saat ini tidak didukung di Swift. Saran saat ini adalah menyiasatinya dengan menggunakan konstanta global:
Jika Anda ingin ini menjadi properti instance, Anda dapat menggunakan properti malas disimpan untuk panjangnya - properti ini hanya akan dievaluasi saat pertama kali diakses, jadi Anda tidak akan menghitungnya berulang kali.
sumber
Bagaimana dengan menggunakan properti yang dihitung?
sumber
Beberapa mungkin menginginkan konstanta kelas tertentu bersifat publik sementara yang lain bersifat pribadi.
kata kunci pribadi dapat digunakan untuk membatasi cakupan konstanta dalam file swift yang sama.
Kelas lain akan dapat mengakses konstanta kelas Anda seperti di bawah ini
sumber
Mencoba di Playground
sumber