Saya bisa melihat definisi ini di perpustakaan Swift:
extension Bool : BooleanLiteralConvertible {
static func convertFromBooleanLiteral(value: Bool) -> Bool
}
protocol BooleanLiteralConvertible {
typealias BooleanLiteralType
class func convertFromBooleanLiteral(value: BooleanLiteralType) -> Self
}
Apa perbedaan antara fungsi anggota yang didefinisikan static func
dan yang lainnya didefinisikan sebagai class func
? Apakah itu hanya static
untuk fungsi statis dari struct dan enum, dan class
untuk kelas dan protokol? Apakah ada perbedaan lain yang harus diketahui? Apa alasan untuk memiliki perbedaan dalam sintaksis itu sendiri?
class func
? Dengan informasi yang kita miliki sekarang, perbedaan ini agaknya tidak berguna, bukan?class func
serror: class methods are only allowed within classes; use 'static' to declare a static method
Jawaban:
Itulah perbedaan utama. Beberapa perbedaan lain adalah bahwa fungsi-fungsi kelas secara dinamis dikirim dan dapat ditimpa oleh subclass.
Protokol menggunakan kata kunci kelas, tetapi tidak mengecualikan struct dari penerapan protokol, mereka hanya menggunakan statis. Kelas dipilih untuk protokol sehingga tidak perlu ada kata kunci ketiga untuk mewakili statis atau kelas.
Dari Chris Lattner tentang topik ini:
Dan inilah cuplikan yang menunjukkan beberapa perilaku override fungsi kelas:
sumber
static func myFunc()
alih-alih,class func myFunc
Anda akan mendapatkan kesalahan berikut l: tidak dapat mengganti metode statis . Mengapa? Karena itu seolah-olah ditandai denganfinal
. Untuk informasi lebih lanjut. Lihat jawaban nextD di bawah ini. Jugax.dynamicType
sekarang telah digantikan dengantype(of:x)
Agar lebih jelas, saya membuat contoh di sini,
static func
sama denganfinal class func
Karena itu
final
, kita tidak dapat menimpanya dalam subkelas seperti di bawah ini:sumber
class func
berbeda dari normalfunc
meskipun keduanya dapat ditimpa. Tetapifunc
untuk instance / objek danclass func
dapat diakses melalui kelas sepertiClassA.classFunc()
Saya melakukan beberapa percobaan di taman bermain dan mendapatkan beberapa kesimpulan.
TL; DR
Seperti yang Anda lihat, dalam kasus
class
, penggunaanclass func
ataustatic func
hanya masalah kebiasaan.Contoh taman bermain dengan penjelasan:
sumber
class
fungsi dinamis vs yang mengikat statisstatic
.class func
ditimpa?class func
bisa ditimpa. Saya akan memilih ini sebaliknya; suka penelitian dan contoh!Sumber: Bahasa Pemrograman Swift - Tipe Variable Properties
sumber
Menurut Swift 2.2 Book yang diterbitkan oleh apel:
“Anda menunjukkan metode jenis dengan menulis
static
kata kunci sebelum kata kunci func metode. Kelas juga dapat menggunakanclass
kata kunci untuk memungkinkan subclass untuk mengesampingkan penerapan metode tersebut pada superclass . "sumber
Dari Swift2.0, Apple mengatakan:
"Selalu awali persyaratan jenis properti dengan kata kunci statis saat Anda mendefinisikannya dalam protokol. Aturan ini berkaitan meskipun persyaratan jenis properti dapat diawali dengan kelas atau kata kunci statis saat diterapkan oleh suatu kelas:"
sumber
Contoh ini akan menghapus setiap aspek!
Keluaran:
sumber
Ini disebut metode tipe, dan disebut dengan sintaks dot, seperti metode instance. Namun, Anda memanggil metode tipe pada tipe, bukan pada instance dari tipe itu. Inilah cara Anda memanggil metode tipe pada kelas yang disebut SomeClass:
sumber
static
danclass
kata kunci.